2017-03-09 86 views
0

確實存在其中包含一些調用中使用的CMake的ADD_LIBRARY功能編譯器標誌,例如使用的那些變量,當我們添加一個模塊:CMake的ADD_LIBRARY函數的編譯器標誌的哪個變量?

ADD_LIBRARY(mylib MODULE mysrc.cpp) 

或者,有沒有得到這樣的標誌的一種方式?

+0

的問題是CMake的發電機會終於湊齊了編譯器標誌(爲完整的公式見我的答案[這裏](HTTPS:/ /stackoverflow.com/questions/33828855/is-cmake-set-variable-recursive/33834879#33834879]))。所以在配置步驟中沒有所有的標誌。你想用旗幟做什麼?一個選項將例如是['CMAKE_EXPORT_COMPILE_COMMANDS'](https://stackoverflow.com/questions/20059670/how-to-use-cmake-export-compile-commands)。 – Florian

+0

謝謝Florian!我希望CMake編寫一個包裝來簡化用戶模塊的編譯,即編寫一個簡單的腳本,它可以在Linux上使用gcc編寫,例如:'g ++ -shared -fPIC -O3'。出於可移植性的原因,我希望得到來自CMake的'-shared -fPIC'標誌,而不是處理每個特定的情況(系統,編譯器) – Aleph

+0

您能否解釋一下「編寫一個包裝以簡化編譯用戶模塊」會做?像[這](http://stackoverflow.com/questions/37787796/why-does-cmake-ignore-exported-cxx-and-cc-environment-variables)? – Florian

回答

0

談到我的意見爲答案

沒有一個單一的CMake變量來獲取所有的編譯器標誌。問題是CMake生成器會最終將編譯器標誌(來自各種CMake變量和屬性,包括來自依賴的目標)放在一起。所以在配置步驟中沒有所有的標誌。

我看到以下可能的問題/解決方案對:

  • CMake的是在你的編譯器的跨平臺包裝(這實際上是什麼C代表),所以不需要提取編譯器標記成外部腳本
  • 如果您只是想添加一種過濾器到CMake所稱的過濾器,您可以相應地設置「啓動器」變量/屬性,例如CMAKE_CXX_COMPILER_LAUNCHERRULE_LAUNCH_LINK
  • 如果你想在機器可讀的JSON格式的編譯器調用,你可以通過設置CMAKE_EXPORT_COMPILE_COMMANDS
  • 如果你只是想看看編譯器調用含導出這些。所有的標誌,你可以設置CMAKE_VERBOSE_MAKEFILE
  • 如果你真的只需要在輸出編譯器標誌和你不想CMake的實際編譯任何東西,你可以 - 至少CMake的的Makefile發電機 - 修改CMAKE_CXX_COMPILE_OBJECTCMAKE_CXX_CREATE_SHARED_MODULE這樣:

    set(CMAKE_DEPFILE_FLAGS_CXX "") 
    set(
        CMAKE_CXX_COMPILE_OBJECT 
        "<CMAKE_COMMAND> -E echo <FLAGS>" 
    ) 
    set(
        CMAKE_CXX_CREATE_SHARED_MODULE 
        "<CMAKE_COMMAND> -E echo <CMAKE_SHARED_MODULE_CXX_FLAGS> <LINK_FLAGS> <CMAKE_SHARED_MODULE_CREATE_CXX_FLAGS>" 
    ) 
    
    file(WRITE mysrc.cpp "") 
    add_library(mylib MODULE mysrc.cpp) 
    

參考

+0

嗨弗洛裏安!實際上,我終於發現CMAKE_CXX_CREATE_SHARED_MODULE包含我正在尋找的東西。此外,我似乎不是真的「沒有CMake變量來獲得編譯器標誌」。實際上,編譯器和鏈接器標誌存在很多變量。最後,像你在例子中那樣修改變量通常不是一個好主意。一個好的方法是使用SET_TARGET_PROPERTY來修改特定目標的本地標誌,比如說「mylib」: SET_TARGET_PROPERTIES(mylib LINK_FLAGS「-undefined dynamic_lookup」) – Aleph

+0

@Aleph你說得對,我的推理不是很合理。我已經相應地改變了我的答案。但是我使用的這些變量不能作爲屬性使用,所以如果我想更改這些全局設置,則沒有其他選擇。是的,腳本示例應謹慎使用,因爲它會修改編譯器/鏈接器調用以使其不做任何操作,只是將標誌回顯到'stdout'。 – Florian

+0

感謝您更新您的答案。但是,我不確定是否說「SET解決方案」是沒有其他選擇的。對於編譯器標誌,比較好的選擇是調用ADD_DEFINITIONS或ADD_COMPILE_DEFINITIONS。您也可以在啓用GLOBAL選項的情況下,通過調用SET_PROPERTY來替換對SET_TARGET_PROPERTIES的調用。此外,我的第一個問題涉及獲取標誌的方式,而不是如何修改它們。我的目標是讓CMake編寫一個腳本,比如'mycpp',它包裝了編譯命令,因爲我希望用戶能夠編譯它自己的模塊。 – Aleph