當你混合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}")
請注意引用。如果列表不是引號,則將其展開爲其項目(並且不再是列表)。要在命令之間傳遞一個列表,請引用它。
你使用g ++/gcc嗎? – 2014-08-27 10:45:57
g ++/gcc或clang,取決於平臺。 – 2014-08-27 10:48:51
您可能想看看實驗['target_compile_features'命令](http://www.steveire.com/cmake-future/manual/cmake-compile-features.7.html),它可以讓我們獲得完全除去了這個用例的不可移植編譯器標誌。截至目前(CMake 3.0.1),這個特性並不隨CMake一起發佈,但我們應該在下一個版本中獲得它。 – ComicSansMS 2014-08-27 11:09:02