2016-09-15 64 views
7

此問題與Instruct Cmake to use CXX and CXXFLAGS when driving link?有關在前一個問題中,我們試圖指示CMake在調用鏈接器時使用CXXFLAGSadd_compile_options和SET之間的區別(CMAKE_CXX_FLAGS ...)

add_compile_options

我們發現,下面的代碼

if (CMAKE_VERSION VERSION_LESS 2.8.12) 
    add_definitions(-foo) 
else() 
    add_compile_options(-foo) 
endif() 

message(STATUS, "CXXFLAGS: ${CMAKE_CXX_FLAGS}") 

產生輸出

CXXFLAGS: 

SET CMAKE_CXX_FLAGS

我們發現,下面的代碼

SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -foo") 

message(STATUS, "CXXFLAGS: ${CMAKE_CXX_FLAGS}") 

產生輸出

CXXFLAGS: -foo 

問題

我們發現的CMake將建立在這兩種情況下使用-foo目標文件。所以-foo絕對是進入CXXFLAGS

第一套CMake代碼和第二套CMake代碼之間有什麼區別?

爲什麼CMAKE_CXX_FLAGS在一個實例中未設置,並在另一個實例中設置?

+0

如果版本很重要:'cmake --version'返回'cmake版本3.6.2'。 – jww

+0

這是你在過去幾天內關於CMake的第五個問題。你介意承認它叫做CMake而不是Cmake? – usr1234567

+0

@ usr1234567 - 是的,抱歉的問題。希望CMake的人不會維護它,所以責任現在落在我身上。我對CMake幾乎一無所知,因爲我使用GNUmake並編寫自己的makefile。我*後悔*接受那些CMake補丁...是的,我會得到編輯的問題。對於那個很抱歉。 – jww

回答

9
  • CMAKE_CXX_FLAGS用於爲所有C++目標添加標誌。這很方便傳遞一般參數,如警告級別或選定的所需C++標準。它對C或Fortran目標沒有影響,用戶可能會傳遞額外的標誌。

  • add_compile_options將選項添加到目錄及其子目錄內的所有目標。如果您在某個目錄中有一個庫,並且想要將選項添加到與該庫相關的所有目標,但與所有其他目標無關,則此功能非常方便。此外,add_compile_options可以處理參數generator expressions。所述documentation明確規定,即

該命令可以用來添加任何選項,但是可替代的命令 存在添加預處理器定義(target_compile_definitions()add_definitions())或包含目錄 (target_include_directories()include_directories())。

  • add_definitions旨在通過限定,並設置預處理器的變量的類型-DFOO -DBAR=32/D在Windows上)的預處理器的值。您可以傳遞任何標誌,但上述表單的標誌將被檢測並添加到[COMPILE_DEFINITIONS][2]屬性中,您可以稍後閱讀和更改該屬性。在這裏,您也可以使用發生器表達式documentation提到目錄,目標和源文件的作用域。

對於一個給定的目標,CMake的將收集的所有標誌從CMAKE_CXX_FLAGS,目標的和目錄的COMPILE_DEFINITIONS和影響目標的所有add_compile_options
CMAKE_CXX_FLAGS不會被其他命令改變,反之亦然。這會違反這些命令的範圍。

+0

謝謝@ usr1234567。在調用站點,當'CMAKE_CXX_FLAGS'用'message(STAUS,...)'打印時,爲什麼CMake不會產生通過'target_compile_definitions'和'add_definitions'添加的值?他們爲什麼不打印? – jww

+1

@jww:因爲'CMAKE_CXX_FLAGS'不會累加與'target_compile_definitions'和'add_definitions'一起添加的值。它是*發生器*,它形成編譯器調用並收集其所有選項:從變量'CMAKE_CXX_FLAGS','CMAKE_CXX_FLAGS_ ',來自目標的'COMPILE_DEFINITION'屬性等等。 – Tsyvarev

+0

@jww:我添加了一個關於你的問題的段落。 – usr1234567

相關問題