【发布时间】:2012-03-17 12:06:15
【问题描述】:
我目前正在从事一个项目,其中有大约 20 个 c 源文件和大约 8 个二进制目标。我们发现 Makefile 维护相当困难且容易出错。主要问题是记录哪些二进制文件依赖于哪些目标文件,因为自动头文件依赖解析看起来相当简单(但我们还没有实现它)。
这是我们的 makefile 当前设置方式的示例。两个程序 foo 和 bar。 Foo 需要使用从 timestamp.c 导出的函数,而 bar 需要使用从 pretty_print.c 导出的函数,而后者又使用时间戳函数来生成带时间戳的字符串。
foo bar:
$(CC) -o $@ $^ $(CFLAGS) $(LIBS)
foo: foo.o timestamp.o
foo.o: timestamp.h
bar: bar.o pretty_print.o timestamp.o
bar.o: pretty_print.h
pretty_print.o: pretty_print.h timestamp.h
timestamp.o: timestamp.h
有没有更好的方法来做到这一点(除了自动生成 foo.o 和 bar.o 行)?我觉得好像必须有一种更好的方法,而不是在不包含 timestamp.h 的情况下编写该条取决于 timestamp.o。这实际上是大多数错误的根源。直到链接器找不到符号“create_timestamp”,我们才意识到 pretty_print 依赖于时间戳中的函数。也许这就是它的工作方式?
【问题讨论】:
-
一个小提示:在目标文件的规则中(例如
timestamp.o:行),您不仅应该将头文件包含在源文件中,还应该包含源文件。所以timestamp.o的规则如下所示:timestamp.o: timestamp.c timestamp.h。 -
如果您不使用自动跟踪此内容的 IDE 或其他工具(如 automake),那么您很不走运,并且在找到新的依赖项时必须手动编辑正确的 makefile。
标签: c linux dependencies makefile