2013-05-19 25 views
0

我使用CMake在Windows,OSX和Linux上生成構建文件(生成文件或項目文件),並使用C和C++編譯器原生於這些平臺。在Windows上我gnerate VS 2010的項目,並在Release配置的以下錯誤occures:CMake:只爲一個平臺設置正確的編譯器選項

命令行錯誤D8016: '/ ZI' 和 '/ OB2' 命令行選項不兼容

顯然,CMake會生成不兼容的優化和調試信息選項。這是默認的CMake配置,我沒有設置任何特殊的標誌。

我通過在Visual Studio中的項目選項中修改/ ZI來解決此問題,但是這使得設置連續集成系統變得煩人 - 我需要添加腳本來修改項目文件。

我可以強制CMake格式化/ Z7(C7兼容調試信息)而不是/ ZI嗎?

另外,如何才能使它僅在發佈配置中生成,而不是在調試中生成?

回答

4

我不認爲CMake默認應用/ZI來釋放標誌 - 它可能在您的CMakeLists.txt中的其他地方應用,或者它包含在其中的一個CMake文件中。

然而,你可以做類似切換標誌:

if(MSVC) 
    string(REGEX REPLACE "/Z[iI7]" "" 
     CMAKE_CXX_FLAGS_RELEASE 
     "${CMAKE_CXX_FLAGS_RELEASE}") 
    set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /Z7") 
endif() 

第一條線所有/Zi/ZI/Z7標誌,如果他們在發行標誌已經存在。請注意使用""${CMAKE_CXX_FLAGS_RELEASE}"。這個CMake變量保持單個字符串很重要。如果引號被刪除,變量將變成分號分隔的列表(即每個空格被分號替換),這不適合傳遞給編譯器。

可以這裏給予衝突的旗幟,如果你想。因此,如果您刪除了string(REGEX REPLACE ...)命令並簡單地離開了set命令,${CMAKE_CXX_FLAGS_RELEASE}可能包含... /ZI ... /Z7 ...",但只要/Z7是最後一個調試信息標誌,它就是「勝利」並且是最終得到應用的那個標誌。

但是,對於首先清理變量的努力,我覺得值得剝奪相互矛盾的標誌。

+0

+1爲偉大的答案。你的解決方案實際上工作,測試它 - 但問題是在你的CMakeLists.txt文件中。 – zmilojko