C 如何使makefile自动链接库?

C 如何使makefile自动链接库?,c,makefile,C,Makefile,如何修改此makefile以自动链接库?从另一个答案中的注释可以看出,您正在使用make test构建一个不同于makefile中指定的程序(您只需键入make)即可,您需要为默认规则使用正确的变量名: CC=gcc CFLAGS=-Wall LDFLAGS=-lm OBJECTS=client.o SOURCE=client.c client: $(OBJECTS) $(CC) $(CFLAGS) $(OBJECTS) -o client $(LDFLAGS) $(LIBS) a

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

从另一个答案中的注释可以看出,您正在使用
make test
构建一个不同于makefile中指定的程序(您只需键入
make
)即可,您需要为默认规则使用正确的变量名:

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
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
在makefile中,您可以使用
maketest
将test.c编译成名为test的可执行文件(或
makeclient
编译client.c)

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

编辑

需要明确的是,GNU制定的默认规则适用于
.c
文件,以在没有其他规则与可执行文件匹配时生成可执行文件:

OBJECTS=client.o otherfile.o extra.o

client: $(OBJECTS)
        $(CC) $(LDFLAGS) -o $@ $^ $(LDLIBS)
make的其他版本也做了类似的事情(gnumake的
$(TARGET_ARCH)
$(LOADLIBES)
是特定于gnumake的;许多make也没有
$(CPPFLAGS)
)。通过在没有Makefile的目录中运行
make-p
,可以看到默认的规则集


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

您所说的“自动”是什么意思
make
根本不理解C或链接过程,它只处理你给它的规则。Plan 9定义了一个pragma,每个头文件都使用这个pragma,这很有趣,它完全符合你的要求。对不起,我想我解释得不好,我最近才开始学习C。我不想每次使用库时都输入gcc-o test.c-L/path/to/libs-lm。有没有一种方法可以更改makefile,使其完成gcc-o test.c-L/path/to/libs-lm所做的所有事情?您几乎已经拥有了它。LIBS=-L/path/to/LIBS。@fuzzxl:MSVC也有它(
#pragma comment(lib,“kernel32.lib”)
)当我使用它时,我会收到一条错误消息,即使它应该可以工作:/tmp/cc3kJ0AG.o:In function
main:test.c:(.text+0x24):对
sqrt'collect2的未定义引用:错误:ld返回1退出状态make:**[test]错误1您是对的。不知何故,我觉得makefile会将这些规则应用于任何扩展名为.c的文件。我将makefile中“client”的每个实例都更改为“test”,它工作了。@HarshpreetSingh:它将其规则应用于任何扩展名为.c的文件,只是它应用的规则与makefile中的
client
规则不太匹配。
CC=gcc
CFLAGS=-Wall
LDFLAGS=-L/path/to/libs
LDLIBS=-lm
OBJECTS=client.o otherfile.o extra.o

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