【发布时间】:2015-02-27 19:28:51
【问题描述】:
我正在使用带有 gcc 的 makefile。每个 c 文件都有一个随附的标题:
main.c main.h
test.c test.h
main.c 包括 main.h 和 test.h
test.c 包含 test.h
我想避免重新编译每个 c 文件。 Makefile 在没有 -B 参数的情况下运行。
我可以手动编写整个 makefile 并指定每个依赖项。编辑头文件时,仅重新编译必要的 c 文件。 test.h 中的编辑将重新编译这两个 c 文件,而 main.h 中的更改只会重新编译 main.c。应该的。
当我切换到更自动化的方法时,这不起作用:
OBJ = main.o test.o
%.o: %.c %.h
$(CC) -c -o $@ $<
main: $(OBJ)
$(CC) -o main $(OBJ)
test.h 中的更改只会重新编译 test.c。使用旧版本的 test.h 标头将 main.c 留在旧版本中。如果我想使用这种方法,我不得不使用 -B 运行 makefile。
我可以手动指定标题:
DEPS = main.h sort.h
%.o: %.c $(DEPS)
$(CC) -c -o $@ $<
然后在 main.h 中的更改重新编译 main.c 和 test.c,后者是不必要的。
如果我有很多文件,更新 makefile 中的每一个更改是很麻烦的,并且使用自动化方法会增加编译时间。
是否有更好的解决方案,仅重新编译所需文件,或者手动指定所有内容的唯一方法?
【问题讨论】:
-
查找 gcc 选项以根据包含文件输出 Makefile 依赖项。
-
@chqrlie 抱歉,这对我来说是个死胡同,我是 make&gcc 的新手,因此在这里寻求建设性的答案。
-
如果您无法按照示例进行自动依赖跟踪,那么最后一段中您的问题的答案是“没有更好的解决方案(您能够实现),所以手动指定是唯一的方法”。
-
@MadScientist 不,我无法跟踪很长的外部链接,因为我不知道自动依赖跟踪具体是什么。这就是我在这里问的原因。我虽然这是一个问答网站。
标签: c gcc compilation makefile