我想知道在调用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")