GNU make和对象列表

时间:2016-07-20 09:32:18

标签: c makefile

我有大约10个包含标题(.h)的源文件(.c)。 只有两个源文件(.c)链接到可执行文件(ELF)并包含main函数。大多数文件被编译成对象(.o)和(重新)使用(静态链接)可执行文件。

我试图定义一个通用规则来构建所有对象:

%.o : %.c
    $(CC) $(CCFLAGS) -c -o $@ $<

这对编译成对象的源非常有用。每次添加新的源文件时,我都不必担心更新make文件。

但我不知道创建可执行文件规则的最佳方法是什么?

exec1 : object1.o object2.o object3.o
    call the linker
exec2 : object1.o object2.o object4.o object5.o
    call the linker

这将有效;但是,每当我要包含一个新标题(foo.h)时,我还需要记住更新此规则的对象列表(添加foo.o)。

有没有什么方法可以自动解析给定目标所需的对象(可能基于包含的头文件?)?

是否有更好的方法来定义可执行文件的目标?

请注意我不能使用通配符,因为并非所有可执行文件都需要所有对象。或者链接器可以删除多余的对象吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

您可以使用wildcard功能自动执行文件列表维护,例如

sources := $(patsubst %.c,%.o,$(wildcard *.c))

您还应该列出像

这样的标题文件
headers := $(wildcard *.h)

将它们添加到编译规则中,如

%.o : %.c $(headers)

GNU Make manual(https://www.gnu.org/software/make/manual/make.html)包含更多信息,包括可能存在的陷阱。