Jan*_*egg 12 c c++ cmake c++11
我想补充-std=c++11一下
add_compile_options("-std=c++11")
Run Code Online (Sandbox Code Playgroud)
但是,这也将它们添加到C文件的编译中,而不仅仅是C++.我知道我可以根据使用的配置添加条件编译标志:
add_compile_options("$<$<CONFIG:DEBUG>:-addMeInDebugOnly>")
Run Code Online (Sandbox Code Playgroud)
如何将我的标志仅添加到c ++文件?我正在寻找类似的东西:
add_compile_options("$<$<??:??>:-std=c++11>")
Run Code Online (Sandbox Code Playgroud)
但是我需要填写问号呢?
Lek*_*eyn 21
当您具有混合的C和C++源时,该LINKER_LANGUAGE属性可能会应用错误的标志来编译各个源.解决方案是使用COMPILE_LANGUAGE生成器表达式(与CMake 3.3一起引入).原始C++ 1x标志的最简单示例是:
add_compile_options($<$<COMPILE_LANGUAGE:CXX>:-std=c++11>)
Run Code Online (Sandbox Code Playgroud)
如果有一串编译选项(例如,对于COMPILE_FLAGStarget属性的用法),则必须拆分标志
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}")
Run Code Online (Sandbox Code Playgroud)
但是,不赞成使用字符串.使用列表时,您可以使用:
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}")
Run Code Online (Sandbox Code Playgroud)
注意引用.如果列表不是引号,则会将其扩展为其项目(并且不再是列表).要在命令之间传递列表,请引用它.
小智 6
您可以使用LINKER_LANGUAGE目标属性仅将标志添加到 C++ 目标*:
add_compile_options(
"$<$<STREQUAL:$<TARGET_PROPERTY:LINKER_LANGUAGE>,CXX>:-std=c++11>"
)
Run Code Online (Sandbox Code Playgroud)
*请注意,这不适用于具有混合 C/C++ 源的目标
CMAKE_CXX_FLAGS也应该可以正常工作:
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
Run Code Online (Sandbox Code Playgroud)
project如果在命令之前设置(例如在工具链中),您可能需要将它们添加到缓存中:
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11" CACHE STRING "" FORCE)
Run Code Online (Sandbox Code Playgroud)