C GNU制造和对象列表

C GNU制造和对象列表,c,makefile,C,Makefile,我有大约10个带有头(.h)的源文件(.c)。 只有两个源文件(.c)链接到可执行文件(ELF)中并包含主函数。大多数文件被编译成对象(.o)并与可执行文件一起使用(静态链接) 我尝试定义一个通用规则来构建所有对象: %.o : %.c $(CC) $(CCFLAGS) -c -o $@ $< 这将起作用;但是,每当我包含一个新的头(foo.h)时,我还需要记住更新这个规则的对象列表(addfoo.o) make是否有任何方法可以自动解析给定目标所需的对象(可能基于包含的头文件?

我有大约10个带有头(.h)的源文件(.c)。 只有两个源文件(.c)链接到可执行文件(ELF)中并包含主函数。大多数文件被编译成对象(.o)并与可执行文件一起使用(静态链接)

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

%.o : %.c
    $(CC) $(CCFLAGS) -c -o $@ $<
这将起作用;但是,每当我包含一个新的头(foo.h)时,我还需要记住更新这个规则的对象列表(addfoo.o)

make是否有任何方法可以自动解析给定目标所需的对象(可能基于包含的头文件?)

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

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


谢谢

您可以使用
通配符
功能自动执行文件列表维护,如

sources := $(patsubst %.c,%.o,$(wildcard *.c))
您还应该创建一个头文件列表,如

headers := $(wildcard *.h)
并将它们添加到编译规则中,如

%.o : %.c $(headers)

GNU Make manual()提供了更多信息,包括可能的缺陷。

您为可执行文件指定的方式很好,通常新的头对象会修改包含它们的C源代码。根据生成代码对象文件的明确规则,也是默认的GNU生成规则和其他生成变量。对您的特定问题的简短回答是否,Make无法根据源文件中的头文件自动猜测其应包含在可执行文件中的对象。实际上,只需创建“依赖项”文件(通常用
.d
扩展名指定)将它们作为编译规则的第一行包含在
%.o:%.c%.d
中。对于链接器规则,首先创建宏,每个可执行文件一个宏,列出该可执行文件使用的对象文件。然后
可执行文件:&(themacro)
并在配方中使用:
gcc-o$@$>
,然后是所需的
-llibrarypath
-llibrarynames
。然后,您只需在添加/删除/重命名文件时更新
themacro
内容。一种可能是包含所有告诉链接器删除所有“死”代码的对象。可能有一种方法可以做到这一点。是否每个新的对象文件
foo.o
都对应一个匹配的头文件
foo.h
,#包含在同一可执行文件的其他源中?OP不能使用通配符,因为并非所有可执行文件都需要所有对象。为每个对象文件的所有头添加依赖项不是一个好主意。改为使用cpp选项
-MD
。@blatinox您不是完全正确的。尽管并非所有对象都依赖于所有标头,但如果相关标头发生更改,则必须重新生成所有对象。然后,只会重新链接相关的可执行文件
-MD
是一个选项,但它会使构建更加复杂。我的方法非常简单,适用于小型项目。至少,我一直是这样工作的。不,当你修改一个标题时,只有包含该标题的对象才能被重建。使用您的解决方案,您可以重建所有对象!它是无用的,即使它适用于小项目。使用
-MD
和其他(
-MMD
-MP
,…)并不复杂:您只需在Makefile中添加3行,然后
cpp
为您完成工作。这是个人意见的问题。我更喜欢一个简单的makefile,我不在乎有时我会在编译上花费更多的时间。我很少更改头文件,这种方法对我来说是最好的。让OP来决定什么对他更有利。
%.o : %.c $(headers)