2

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

我经常使用 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

这只是在大约 95% 的编译完成 30 分钟后才成为问题。因为我知道使用 CMake 重新配置会强制从头开始重新编译,所以我尝试添加-I/Users/user/software/prod/coin/includeCMAKE_CXX_FLAGSinCMakeCache.txt但无济于事——它仍然从头开始重新编译。由于实际上只有一个源文件包含有问题的标头,因此如果我可以在纠正相关路径后从错误退出的点开始编译,那将是可取的。我该如何做到这一点,顺便说一句,为什么它会强制编译器从头开始?

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

4

2 回答 2

2

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

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

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

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

于 2018-06-02T16:12:31.677 回答
0

CMake 查找文件的“最后修改”时间来决定哪些文件需要重新编译。但是,如果您将输入更改为 CMake 本身,那么它需要重新生成 Makefile 并因此重新编译所有内容。但是,一个黑客可能是可能的......

CMake 将有关包含目录和要链接的库的信息存储在构建目录中的各种文本文件中。因此,一种技巧(不推荐,但有效)可以是修改这些文本文件。

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

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

于 2018-06-02T02:50:21.487 回答