2014-08-27 19 views
8

我想補充-std=c++11CMake的生成器表達式,區分C/C++代碼

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

然而,這也增加了他們的ç文件,不僅C++編譯。我知道我可以添加根據配置條件編譯標誌使用:

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

如何將我的標誌僅添加到C++文件?我正在尋找類似的東西:

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

但是,我需要填寫問號?

+0

你使用g ++/gcc嗎? – 2014-08-27 10:45:57

+0

g ++/gcc或clang,取決於平臺。 – 2014-08-27 10:48:51

+1

您可能想看看實驗['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

回答

2

可以使用LINKER_LANGUAGE目標屬性標誌只添加到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) 
+0

真棒,「target_property:linker_language」正是我正在尋找:) – 2014-09-01 06:19:59

+0

嗯......實際上似乎並沒有工作,畢竟如果C和C++代碼混合在同一目標:( – 2014-09-01 07:02:53

+0

@ruslo:但'CMAKE_CXX_FLAGS'適用於所有的構建類型('CMAKE_BUILD_TYPE_DEBUG','CMAKE_BUILD_TYPE_RELWITHDEBINFO',...),還是我需要以舊的方式來做:http://binglongx.wordpress.com/tag/cmake_build_type/? – telephone 2014-09-22 21:13:03

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

+0

問題在於我想使用頂級CMakeLists.txt文件中的代碼,並將其應用於所有子目錄中的所有cmake文件。所以我不得不添加你的行數十個不同的CMakeLists.txt文件,這不是很好... – 2014-08-27 10:46:55

+0

@JanRüegg你嘗試設置'CMAKE_CXX_FLAGS'像'SET(CMAKE_CXX_FLAGS「-std = C++ 11」CACHE STRING「編譯標誌」FORCE)'(http://stackoverflow.com/questions/15100351/changing-cmake-cxx-flags-in-project) – fritzone 2014-08-27 10:54:45

+0

這就是我目前正在做的事情,但是我本來希望擺脫這是因爲我認爲它是「老醜」的做法,而add_compile_options更現代。 – 2014-08-27 10:56:37

12

當你混合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}") 

請注意引用。如果列表不是引號,則將其展開爲其項目(並且不再是列表)。要在命令之間傳遞一個列表,請引用它。