在cmake调用中附加CXX_FLAGS

时间:2018-01-26 13:17:52

标签: c++ c++11 build cmake

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

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

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

我发现了一些关于向CMakeLists.txt添加c ++ 11支持但未在cmake调用中发布的帖子,所以我想知道这是否可行。请告诉我。

3 个答案:

答案 0 :(得分:0)

是的,这是可能的。首先,在命令行中使用所需的标志创建一个名为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

在旁注中,确保 CMake选项之后../source_dir ,否则CMAKE_CXX_STANDARD_REQUIRED将无效。 (Read

答案 1 :(得分:0)

您可能正在寻找

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")

答案 2 :(得分:0)

我最近在为我工作的某个应用程序构建依赖项时这样做了。 您可以使用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

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