发生了奇怪的事情:
makefile的想法是能够同时编译多个文件。如果您编辑其中一个文件,则在键入make
时,唯一应编译的文件是已编辑的文件。
现在,由于某种原因,我的makefile决定停止识别文件何时发生变化。所以我必须:make clean
和make
再次能够编译,这是荒谬的,因为每次我需要编译大约需要1分钟。
为什么会发生这种情况?
我没有在makefile中添加任何内容;它刚刚开始无处可去。
答案 0 :(得分:2)
有些事情发生了变化;程序不会停止工作,除非发生变化。困难将是解决改变的问题。您可以随时输入:
rm file-that-changed.o
make
只重建一个已更改的文件,但这很麻烦。
是否存在多步编译并且您有一个中间文件,这会让make
感到困惑?
我只是在多步编辑中混淆了。
如果你有一个非标准的文件后缀,你编译成C代码,然后从C编译成目标代码(或任何其他类似的多步编译),那么用make
获得可靠的重新编译的关键是组织后缀列表,以便您的扩展在一开始。不幸的是,没有标准的简单方法来了解内置后缀列表是什么,所以你最终不得不做这样的事情:
SUFFIXES = .y .l .c .o # Yacc, Lex, C, Object files
EXTRA_SUFFIX = .xc # Extreme C, or Extended C, or ...
.SUFFIXES: # Eliminate all built-in suffixes
.SUFFIXES: ${EXTRA_SUFFIX} ${SUFFIXES}
第二行.SUFFIXES
行将您的扩展名放在列表的前面。现在,您可以编写规则以将.xc
文件编译为.c
或.o
文件,然后在修改.xc
文件时,即使存在中间.c
文件1}}文件左右,.xc
比.c
或.o
文件更新的事实将确保重新编译完成。
很久以前,Sun make
版本提供了一个名为SUFFIXES的宏,其中包含了正确顺序的默认后缀。遗憾的是,这没有采用和标准化,所以你必须自己构建后缀列表。但宏观名称的选择并非完全偶然。