c++ - 仅在需要时编译文件

标签 c++ build makefile

我在目录 ./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/

相关文章:

c++ - 如果我是根据较早的if条件创建的,如何在代码中使用后者的实例?

c++ - 缺少 CMake 调试符号

javascript - 在 Reactjs 应用程序中页面重新加载或刷新期间,生产服务器上出现 404 错误。

c++ - GCC 虚拟内存耗尽 : Permission denied

为嵌入式软件构建 (CI) 服务器

c++ - 编译错误/usr/bin/ld : cannot open output file bin/server: No such file or directory

build - 如何告诉premake生成使用clang的Makefile?

Makefile:如何检测 makefile 本身的变化?

c++ - 传递包含空格和引号的参数字符串

c++ - 在 C++ 中嵌入 lua 的问题