我有大约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)。
有没有什么方法可以自动解析给定目标所需的对象(可能基于包含的头文件?)?
是否有更好的方法来定义可执行文件的目标?
请注意我不能使用通配符,因为并非所有可执行文件都需要所有对象。或者链接器可以删除多余的对象吗?
谢谢!
答案 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)包含更多信息,包括可能存在的陷阱。