在 cmake 调用中追加CXX_FLAGS

Appending CXX_FLAGS in cmake invocation

本文关键字:CXX FLAGS 追加 cmake 调用      更新时间:2023-10-16

我想知道在调用cmake时是否可以附加到推断的变量中。由于编译器或应用提供的 CMakeLists.txt C++11 支持不会被cmake检测到,即使它受支持并且应用程序需要它。如果我这样做:

cmake-DCMAKE_CXX_FLAGS='-std=c++11' ../source_dir
标志

被覆盖,我不想丢失推断的标志。我可以手动运行而不覆盖,只需复制标志并附加 c++11,但我认为必须有更好的解决方案。

我找到了很多关于向CMakeLists.txt添加 c++11 支持的帖子,但没有cmake调用中,所以我想知道这是否可能。请让我知道。

是的,这是可能的。首先,在命令行中创建一个名为 MY_FLAGS 的变量,其中包含所需的标志。

cmake -DMY_FLAGS='-std=c++11' ../source_dir

然后,在 CMakeLists.txt 中执行以下操作:

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${MY_FLAGS}")

这将有效地将您的标志修改为 CMake 生成的标志。但是,如果要将C++标准设置为 C++11,则只需执行以下操作,而无需直接处理标志:

cmake -DCMAKE_CXX_STANDARD=11 -DCMAKE_CXX_STANDARD_REQUIRED=ON ../source_dir

附带说明一下,请确保../source_dir在 CMake 选项之后,否则CMAKE_CXX_STANDARD_REQUIRED将不起作用。(阅读(

我最近在为我工作的应用程序之一构建依赖项时这样做了。您可以使用 2 个 CMake 变量,即:

-DCMAKE_BUILD_TYPE=Debug/Release
-DCMAKE_CXX_FLAGS_[DEBUG/RELEASE]

指定构建类型时,cmake 会将第二个变量中指定的标志添加到编译器标志中。所以对我来说,使用:

cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_FLAGS_RELEASE=-fPIC

做了这件事。

在您的情况下,您可以尝试以下方法:

cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_FLAGS_RELEASE=-std=c++11
or
cmake -DCMAKE_BUILD_TYPE=Debug -DCMAKE_CXX_FLAGS_DEBUG=-std=c++11

当然,如果脚本中没有覆盖变量,这将起作用。尝试这两种方法。

您可能正在寻找

set (CMAKE_CXX_STANDARD 11)
set (CMAKE_CXX_STANDARD_REQUIRED ON)

或通过命令行:

cmake -DCMAKE_CXX_STANDARD=11 -DCMAKE_CXX_STANDARD_REQUIRED=ON

话虽如此,CMAKE_CXX_FLAGS并没有被 cmake 覆盖,所以你的 CMakeLists.txt 必须在某个地方做。从脚本中设置标志的礼貌方法是附加到变量,即:

set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} stuff")