如何让makefile自动链接库?

时间:2013-08-27 20:27:57

标签: c makefile

#include <stdio.h>
#include <math.h>

int main(void)
{
    double test=23.4;
    test=sqrt(test);
    printf("%f",test);
}

为了编译这个,我使用: gcc -o test test.c -L / path / to / libs -lm

然而,我想使用我的makefile来自动链接数学库和我将来使用的任何其他标准库。

这是我正在使用的makefile:

CC=gcc
CFLAGS=-Wall
LDFLAGS=-lm

OBJECTS=client.o
SOURCE=client.c

client: $(OBJECTS)
    $(CC) $(CFLAGS) $(OBJECTS) -o client $(LDFLAGS) $(LIBS)

all:client

.PHONY: clean
clean:
    rm -f *~ *.o client

如何修改此makefile以自动链接库?

2 个答案:

答案 0 :(得分:2)

从另一个答案的评论中,您似乎正在使用make test构建一个与makefile中指定的程序不同的程序(当您输入make时获得的程序)如果您想要要使用,您需要为默认规则使用正确的变量名称:

CC=gcc
CFLAGS=-Wall
LDFLAGS=-L/path/to/libs
LDLIBS=-lm

只有你的makefile中的那个,你可以使用make test将test.c编译成一个名为test的可执行文件(或make client来编译client.c。)

如果要将多个文件编译为单个可执行文件,则需要在makefile中添加规则(但使用标准变量名称):

OBJECTS=client.o otherfile.o extra.o

client: $(OBJECTS)
        $(CC) $(LDFLAGS) -o $@ $^ $(LDLIBS)

修改

为了清楚起见,当没有其他规则与可执行文件匹配时,GNU-make的默认规则适用于.c文件以生成可执行文件:

.c:
         $(CC) $(CFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH) $^ $(LOADLIBES) $(LDLIBS) -o $@

其他版本的make做类似的事情($(TARGET_ARCH)$(LOADLIBES)特定于GNU make;许多品牌也没有$(CPPFLAGS))。您可以通过在没有Makefile的目录中运行make -p来查看默认规则集。

如果您愿意,您可以使用Makefile中的不同内容替换上述模式规则,在这种情况下,make将执行您要求它执行的任何操作。

答案 1 :(得分:0)

CC=gcc
CFLAGS=-Wall
LDFLAGS=-lm
LIBPATH=-L/path/to/libs

OBJECTS=client.o
SOURCE=client.c

client: $(OBJECTS)
    $(CC) $(CFLAGS) $(OBJECTS) -o client $(LIBPATH) $(LDFLAGS) $(LIBS)

all:client

.PHONY: clean
clean:
rm -f *~ *.o client