发生错误后如何继续中断编译?

时间:2018-06-01 21:18:03

标签: makefile cmake

由于标记丢失或环境变量设置错误而发生错误后,错误修复后是否可以继续编译?

我经常使用CMake和make来编译需要花费很长时间才能编译的工具包,而且我也经常在这个过程中不正确地设置变量。刚才,例如,我试图在我的机器上包含OpenInventor头文件,它们位于/Users/user/software/prod/coin/include/Inventor目录中。

我错误地通过了

-DINVENTOR_INCLUDE_DIR=/Users/user/software/prod/coin/include/Inventor

而不是正确的

-DINVENTOR_INCLUDE_DIR=/Users/user/software/prod/coin/include

这仅在30分钟后成为问题,当时大约95%的编辑完成。因为我知道使用CMake重新配置会强制从头开始重新编译,所以我尝试在-I/Users/user/software/prod/coin/include中将CMAKE_CXX_FLAGS添加到CMakeCache.txt,但无济于事 - 它仍然从头开始重新编译。由于只有一个源文件实际上包含了有问题的标题,因此一旦相关路径得到纠正,我就可以开始从出现错误的点开始编译。我怎么能这样做,另外,为什么它会迫使编译器从头开始?

我在macOS 10.13上使用CMake版本3.11.1和clang(Apple LLVM版本9.1.0)

2 个答案:

答案 0 :(得分:2)

CMake不需要重新编译所有内容,只是因为它重新生成了makefile。它仍将执行正常的避免操作。但是,CMake会跟踪用于构建每个目标的编译器选项,因此如果您对所有目标的编译器选项进行更改,那么它们都需要重建。

如果只有一个目标需要此编译器选项,则可以将其添加到该目标而不是其他目标,如下所示:

set_property(SOURCE my_source.c APPEND PROPERTY
    COMPILE_FLAGS -I/foo/bar)

然后它应该只重建那个源文件。

答案 1 :(得分:0)

CMake查找文件的“上次修改”次数,以确定哪些文件需要重新编译。但是如果你将输入更改为CMake本身,那么它需要重新生成Makefile并因此重新编译所有内容。但是,一个 hack 可能是......

CMake存储有关包含目录的信息以及要在构建目录中的各种文本文件中链接的库。所以一个 hack (不推荐,但有效)可以修改这些文本文件。

在您提到的特定示例中,黑客将在构建目录的所有文件中搜索并替换/Users/user/software/prod/coin/include/Inventor的所有出现/Users/user/software/prod/coin/include

(另外,如果您还不知道,可以使用make -j <n>使用多个线程来构建,这可以大大减少构建时间。)