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

时间:2014-08-27 10:41:46

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

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

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

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

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

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

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

但是我需要填写问号?

3 个答案:

答案 0 :(得分:17)

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

add_compile_options($<$<COMPILE_LANGUAGE:CXX>:-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(
  "$<$<COMPILE_LANGUAGE:C>:${c_flags}>"
  "$<$<COMPILE_LANGUAGE:CXX>:${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(
  "$<$<COMPILE_LANGUAGE:C>:${c_flags}>"
  "$<$<COMPILE_LANGUAGE:CXX>:${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}")

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

答案 1 :(得分:3)

我宁愿这样做:

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

答案 2 :(得分:2)

您可以使用LINKER_LANGUAGE target属性仅向C ++目标添加标记*:

add_compile_options(
    "$<$<STREQUAL:$<TARGET_PROPERTY:LINKER_LANGUAGE>,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)