CMake生成器表达式,区分C / C ++代码

我想将-std=c++11添加到我的

 add_compile_options("-std=c++11") 

但是,这也将它们添加到C文件的编译中,而不仅仅是C ++ 。 我知道我可以根据使用的配置添加条件编译标志:

 add_compile_options("$<$:-addMeInDebugOnly>") 

如何将我的标志仅添加到c ++文件中? 我正在寻找类似的东西:

 add_compile_options("$<$:-std=c++11>") 

但是我需要填写问号呢?

您可以使用LINKER_LANGUAGE目标属性仅将标志添加到C ++目标*:

 add_compile_options( "$<$,CXX>:-std=c++11>" ) 

*请注意,这对于具有混合C / C ++源的目标不起作用

CMAKE_CXX_FLAGS也可以正常工作:

 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") 

如果它在project命令之前设置(例如在工具链中),您可能需要将它们添加到缓存中:

 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11" CACHE STRING "" FORCE) 

当您具有混合的C和C ++源时, LINKER_LANGUAGE属性可能会应用错误的标志来编译各个源。 解决方案是使用COMPILE_LANGUAGE生成器表达式(与CMake 3.3一起引入)。 原始C ++ 1x标志的最简单示例是:

 add_compile_options($<$:-std=c++11>) 

如果有一串编译选项(例如,用于COMPILE_FLAGS目标属性),则必须拆分标志

 set(WARNCFLAGS "-Wall -Wextra -Wfuzzle -Wbar") # ... string(REPLACE " " ";" c_flags "${WARNCFLAGS}") string(REPLACE " " ";" cxx_flags "${WARNCXXFLAGS} ${CXX1XCXXFLAGS}") add_compile_options( "$<$:${c_flags}>" "$<$:${cxx_flags}>" ) # Two alternative variants for single targets that take strings: target_compile_options(some-target PRIVATE "${WARNCFLAGS}") set_target_properties(some-target PROPERTIES COMPILE_FLAGS "${WARNCFLAGS}") 

但是,不赞成使用字符串。 使用列表时,您可以使用:

 set(c_flags -Wall -Wextra -Wfuzzle -Wbar) # ... add_compile_options( "$<$:${c_flags}>" "$<$:${cxx_flags}>" ) # Two alternative variants for single targets given a list: target_compile_options(some-target PRIVATE ${f_flags}) set_target_properties(some-target PROPERTIES COMPILE_OPTIONS "${c_flags}") 

注意引用。 如果列表不是引号,则会将其扩展为其项目(并且不再是列表)。 要在命令之间传递列表,请引用它。

我宁愿这样做:

 set_source_files_properties( ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp PROPERTIES COMPILE_FLAGS "-std=c++11") 

set_source_files_properties的文档位于http://www.cmake.org/cmake/help/v3.0/command/set_source_files_properties.html