在项目中更改CMAKE_CXX_FLAGS

Spi*_*ros 40 cmake compiler-flags

我在CMakeLists.txt中有以下内容:

project( Matfile )

SET ( CMAKE_CXX_FLAGS "-std=c++0x" )

set ( SOURCES
      "foo.cpp"
      "bar.cpp"
    )

add_library(
        Matfile
        ${SOURCES}
)
Run Code Online (Sandbox Code Playgroud)

您可能想象,我想要做的是使用标志-std = c ++ 0x编译我的C++源代码(我使用的是gcc,我需要C++ 11的功能).不幸的是,这不起作用,在我使用cmake生成makefile时,变量CMAKE_CXX_FLAGS完全无效.

如何在项目文件中设置此变量?

这似乎是一个非常愚蠢的问题,但我只花了不少于两个小时试图解决这个问题.

ar3*_*r31 51

add_compile_options()如果您使用的是2.8.12或更高版本,则应使用最直接的解决方案.对于旧版本,您可以"滥用" add_definitions().虽然它仅用于添加-D标志,但它也适用于任何其他编译器标志.但是,我认为它并不意味着以这种方式使用,并且可能在未来版本中出现问题.

add_compile_options(-std=c++0x) # CMake 2.8.12 or newer
Run Code Online (Sandbox Code Playgroud)

要么

add_definitions(-std=c++0x) # CMake 2.8.11 or older
Run Code Online (Sandbox Code Playgroud)

从CMake 3.3开始,您还可以使用奇怪的生成器表达式语法使此标志仅适用于特定语言(例如,仅C或C++):

 add_compile_options($<$<COMPILE_LANGUAGE:CXX>:-std=c++14> $<$<COMPILE_LANGUAGE:C>:-std=c99>)
Run Code Online (Sandbox Code Playgroud)

但是这不适用于Visual Studio生成器,因此请确保仅将此用于Make/Ninja生成器或使用target_compile_options()将其设置为每个目标范围.

  • 很好,但是在这种情况下它有一个问题,这些参数也被添加到C_COMPILER中,不仅对于CXX而且C不支持一些用于CXX的args,尤其是`-std = c ++ 0x`.在这种情况下更好的解决方案`set(CMAKE_CXX_FLAGS ...)`. (3认同)

Cri*_*ngo 16

在CMake 3.1及更高版本中设置C++标准的正确方法是:

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED on)
Run Code Online (Sandbox Code Playgroud)

也可以为一个单独的目标指定标准:

set_property(TARGET mylib PROPERTY CXX_STANDARD 11)
Run Code Online (Sandbox Code Playgroud)

从CMake 3.8 开始,target_compile_features命令有一个新选项,允许为目标设置所需的标准:

target_compile_features(mylib PUBLIC cxx_std_11)
Run Code Online (Sandbox Code Playgroud)

优点是它将需求传播到依赖目标.如果使用cxx_std_11所需功能编译库,则链接到该库的任何二进制文件都将自动设置此要求.


Chr*_*uns 13

使用FORCE旗帜有帮助吗?

SET ( CMAKE_CXX_FLAGS "-std=c++0x" CACHE STRING "compile flags" FORCE)
Run Code Online (Sandbox Code Playgroud)

  • 这是使标志显示在`ccmake` curses gui中的唯一答案,这就是我想要的。谢谢! (2认同)

Chr*_*uns 5

也许这会更好:

set_source_files_properties(${SOURCES}
       PROPERTIES
       COMPILE_FLAGS  "-std=c++0x")
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,这项工作.但是对于更大的项目,有更多的输出,比如一些库和一些可执行文件,假设所有这些都是用相同的标志编译的,我应该多次重复这些语句吗?没有命令为**all**源文件设置编译标志? (3认同)