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()将其设置为每个目标范围.
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)
也许这会更好:
set_source_files_properties(${SOURCES}
PROPERTIES
COMPILE_FLAGS "-std=c++0x")
Run Code Online (Sandbox Code Playgroud)