从命令行调用CMake时如何添加包含目录

51

我处于一种情况下,不应该干扰现有的CMakeLists.txt文件,但仍然需要将某些g++系统包含目录添加到我的构建中。

换句话说,当调用类似cmake ..这样的命令时,我需要在编译器标志中添加-isystem /path/to/my/include

也许可以像这样使用命令:cmake .. -DCMAKE_CXX_FLAGS="$CMAKE_CXX_FLAGS -isystem /path/to/my/include"?有没有办法实现这个需求?


所以你想添加编译标志然后再删除它们吗?还是只想添加它们? - Marco A.
1
我只想添加它们,而不用修改CMakeLists。 - Ayberk Özgür
请注意,变量引用 $CMAKE_CXX_FLAGS 将引用一个 shell 变量。这可能不是您想要的。实际上,在命令行上它应该是无用的。 - Alexis Wilke
4个回答

35

我有同样的问题。我找到了两个解决方案:

  1. 在之前回答中sakra提出的方法(链接),即设置一个带有C++标志的环境变量:

export CXXFLAGS=-isystem\ /path/to/my/include
cmake <path to my sources>

或者同样的事情,但环境变量仅针对此CMake调用设置:

CXXFLAGS=-isystem\ /path/to/my/include cmake <path to my sources>

重要提示:在启动此表单之前,您必须清理构建目录(即清理CMake缓存)。如果不清除缓存,CMake将继续使用上一次运行时缓存的CMAKE_CXX_FLAGS

  • 直接在cmake字符串中设置CMAKE_CXX_FLAGS

    cmake -DCMAKE_CXX_FLAGS=-isystem\ /path/to/my/include <path to my sources>
    

    我相信可以用更“本地”的方式完成,但我没有找到在CMake中负责头文件路径的变量。


  • 2
    那个重要的提示拯救了我的理智! - Ryan H.
    如果我需要从命令行添加多个目录到包含路径,该怎么办? - maximus
    1
    你可以传递多个-isystem参数(就像使用常规的-I方式一样,即-isystem path0 -isystem path1)。 - avtomaton
    什么都不起作用 - mblw

    17
    您可以在调用CMake之前设置环境变量CXXFLAGS
    $ export CXXFLAGS=-isystem\ /path/to/my/include
    $ cmake ..
    

    CMake会使用环境变量中的标志初始化缓存变量CMAKE_CXX_FLAGS。该变量将影响所有构建类型。


    3
    或者不使用 export 形式:CXXFLAGS=-isystem\ /path/to/my/include cmake .. - avtomaton

    12

    使用-DCMAKE_CXX_STANDARD_INCLUDE_DIRECTORIES=<something>可以让我成功地完成了操作,而不需要工具链文件。这样做可以避免编译器标志的混乱。


    1
    我认为你不应该覆盖它。它是由工具链文件设置的。如果你覆盖它,可能会导致无法找到标准的C++头文件。 - Timmmm
    2
    这仍然可以用作将基于Cmake的项目加载到IDE中的解决方法。此外,当使用LLVM工具链时,此选项有助于强制Cmake查看来自LLVM的标准头文件,而不是安装在系统中的那些(通常来自不同版本的GNU工具链)。 - scrutari

    4

    针对其他答案,我有一个额外的提示:使用CMake3.15.3macOS 10.14.5上时,只有使用CMake标志的解决方案似乎能够正常工作。

    因此,在我的情况下,只有这个解决方案可以正常工作:

    cmake -DCMAKE_CXX_FLAGS=-I\ /path/to/include <path/to/source>
    

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接