代码之家  ›  专栏  ›  技术社区  ›  miterhen

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

  •  2
  • miterhen  · 技术社区  · 6 年前

    由于缺少标志或环境变量设置不正确而发生错误后,是否可以 持续 一旦错误被纠正,就开始编译?

    我经常使用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 回复  |  直到 6 年前
        1
  •  2
  •   MadScientist    6 年前

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

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

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

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

        2
  •  0
  •   user6764549 user6764549    6 年前

    CMake查找文件的“上次修改”时间,以决定哪些文件需要重新编译。但是如果您将输入更改为CMake本身,那么它需要重新生成makefile,从而重新编译所有内容。但还是有一个 乱劈 也许有可能。。。

    CMake在build目录中的各种文本文件中存储有关include目录和要链接的库的信息。那么一个 乱劈 (不推荐,但适用)可以修改这些文本文件。

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

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