我在目录 ./src
中有几个 cpp 和 hpp 文件。我将所有 cpp 文件编译成一个二进制文件,比如 ./bin/run
。我只想在需要时重新编译,即它或其标题之一已更改。
我可能可以创建 Makefile,当且仅当文件被更改时,文件才会被重新编译,但这很不舒服,因为我的大部分代码都在标题中。 (不会改,因为product本身就是header,cpp文件就是test)。
我想在./build
中存储临时的.o
文件
我知道 g++ -MM
函数,但我不确定如何使用它。
我很高兴看到解决方案不需要使用 make
,但只要足够简单,就可以使用任何其他系统。
UPD 我会尽力澄清,问题是什么:
可能会创建新的 cpp,可能会添加或删除包含的内容,等等。我不想每次都编辑我的 makefile。
最佳答案
为了解决我提到的问题(-include
不是一个好的解决方案),我使用这样的方法:
build/%.o: %.cpp
@$(CC) -MD -c -Wall -o $@ $<
@cp build/$*.d build/$*.P
@sed -e 's/#.*//' -e 's/^[^:]*: *//' -e 's/ *\\$$//' \
-e '/^$$/ d' -e 's/$$/ :/' < build/$*.P >> build/$*.d
@rm build/$*.P
-include build/*.d
不需要 `%.d 规则。
编辑:
@JackKelly [*cough*, *choke*] 向我展示了一种有效获取相同依赖文件的更好方法:
build/%.o: %.cpp
@$(CC) -MD -c -Wall -o $@ $<
@$(CC) -MM -MP -Wall -o $*.d $<
-include build/*.d
是的,你可以对同一个目标有多个规则,只要其中一个有命令即可;先决条件积累。我们的想法是获取这样的文件:
file.o: file.cpp headerfile.h
headerfile.h:
第二行(headerfile.h:
)是headerfile.h
的规则,没有先决条件或命令。它什么都不做,但这是一个规则,所以如果 headerfile.h
丢失,Make 会满意。
关于c++ - 仅在需要时编译文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12866155/