2016-11-06 290 views
2

我的cmake項目應編譯C++ 14代碼。它還使用從其外部庫(這是我的項目中的git子模塊)中包含的CMakeLists.txts。構建在macOS Sierra(cmake 3.6.2)上失敗,因爲the default STL of clang is old and doesn't handle c++11。據我瞭解,有兩個STL隨鐺發貨:libstdC++(來自gcc)(默認)或libC++。所以,如果我的-stdlib=libc++選項添加到CMake的,源編譯:讓cmake與clang使用C++ 11(C++ 14)

add_compile_options("$<$<COMPILE_LANGUAGE:CXX>:-std=c++14>") 
add_compile_options("$<$<COMPILE_LANGUAGE:CXX>:-stdlib=libc++>") 

但隨後在鏈接時失敗,因爲它試圖使用的libstdC++用於鏈接。如何在cmake中指定新的STL libC++應該用於整個構建過程?

PS: clang使用gcc STL的默認原理是什麼?我可以永久指定它應該使用哪個STL嗎?或者我正在做一些完全錯誤的事情(我的一些子項目可以默默地強制gcc?)?

+0

更新:我錯誤的stdlib(和上面的問題)的問題是由我的一個sub-CMakeLists.txt中的一行'set(CMAKE_OSX_DEPLOYMENT_TARGET 10.7)'引起的;見下面的評論! – telephone

回答

7

您應該依靠CMake的處理編譯選項。只需指定要標準版本:

set(CMAKE_CXX_STANDARD 14) 
set(CMAKE_CXX_STANDARD_REQUIRED ON) 

target_compile_features也可以用於需要標準的特定功能(和隱含要求CMake的設置適當的配置)。更多信息here

+0

它不適合我。我有Ogre3D作爲子模塊。讓我們只考慮單獨構建它。 cmake配置順利,但編譯(通過make)失敗。考慮它的CMakeLists.txt:https://bitbucket.org/sinbad/ogre/src/108ab0bcc69603dba32c0ffd4bbbc39051f421c9/CMakeLists.txt?at=v1-9。如果我刪除第35-43行並在頂部添加代碼,則編譯失敗(來自C++ 14的未知STL模板)。保持CMakeLists.txt不變,編譯順利(C++ 11)。 – telephone

+0

經過大量的挖掘工作(通過使用'make VERBOSE = 1'來查看編譯器調用的cmake),它是一個標誌'mmacosx-version-min = 10.7',可以導致編譯錯誤[通過給它錯誤的頭文件] (http://stackoverflow.com/a/2927217/753850)。事實證明,Ogre3D的_CMakeLists.txt_是問題:它有一行'set(CMAKE_OSX_DEPLOYMENT_TARGET 10.7)'。 這實際上完全解決了我的問題! – telephone

1

我想,你還需要到法蘭面傳遞到連接器的情況下,鏗鏘:

link_libraries("-stdlib=libc++") 
+0

謝謝!我將首先嚐試讓'CMAKE_CXX_STANDARD'工作(如上面的答案),但是您的答案就是我一開始就在尋找的東西(儘管還沒有嘗試過)。 – telephone

相關問題