3 回答

TA貢獻(xiàn)1850條經(jīng)驗(yàn) 獲得超11個(gè)贊
多次添加同一子目錄是毫無(wú)疑問(wèn)的,這并不是CMake的工作方式??梢圆捎脙煞N主要方法來(lái)進(jìn)行清潔:
在與應(yīng)用程序相同的項(xiàng)目中構(gòu)建庫(kù)。對(duì)于正在積極使用(在使用應(yīng)用程序時(shí))正在使用的庫(kù),請(qǐng)首選此選項(xiàng),以便它們可能經(jīng)常被編輯和重建。它們還將顯示在同一IDE項(xiàng)目中。
在外部項(xiàng)目中構(gòu)建您的庫(kù)(我不是說(shuō)ExternalProject)。對(duì)于僅由您的應(yīng)用使用但未使用它們的庫(kù),請(qǐng)首選此選項(xiàng)。大多數(shù)第三方庫(kù)就是這種情況。它們也不會(huì)使您的IDE工作區(qū)混亂。
方法1
您的應(yīng)用CMakeLists.txt添加了庫(kù)的子目錄(而庫(kù)的CMakeLists.txt不添加)
您的應(yīng)用CMakeLists.txt負(fù)責(zé)添加所有直接和傳遞依賴項(xiàng),并以正確的順序添加它們
它假定添加的子目錄libx將創(chuàng)建一些libx易于使用的目標(biāo)(例如)target_link_libraries
附帶說(shuō)明:對(duì)于庫(kù)來(lái)說(shuō),創(chuàng)建一個(gè)功能齊全的庫(kù)目標(biāo)是一個(gè)好習(xí)慣,即,其中包含使用該庫(kù)所需的所有信息:
add_library(LibB Src/b.cc Inc/b.h)
target_include_directories(LibB PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/Inc>)
因此,庫(kù)的包含目錄的位置可以保留為lib的內(nèi)部事務(wù)。您只需要這樣做;
target_link_libraries(LibC LibB)
然后LibB還將將的包含目錄添加到的匯編中LibC。PRIVATE如果LibB的公共標(biāo)頭未使用,請(qǐng)使用修飾符LibC:
target_link_libraries(LibC PRIVATE LibB)
方法#2
在單獨(dú)的CMake項(xiàng)目中構(gòu)建和安裝庫(kù)。您的庫(kù)將安裝一個(gè)所謂的config-module,該模塊描述頭文件和庫(kù)文件的位置并編譯標(biāo)志。您的應(yīng)用程序CMakeList.txt假設(shè)已經(jīng)建立并安裝了庫(kù),并且可以通過(guò)find_package命令找到配置模塊。這是另一個(gè)完整的故事,所以我在這里不再贅述。
一些注意事項(xiàng):
您可以混合使用#1和#2,因?yàn)樵诖蠖鄶?shù)情況下,您將擁有不變的第三方庫(kù)和正在開發(fā)的自己的庫(kù)。
#1和#2之間的折衷方案是使用ExternalProject模塊,這是許多人首選的模塊。這就像將庫(kù)的外部項(xiàng)目(在其自己的構(gòu)建樹中構(gòu)建)包含到應(yīng)用程序的項(xiàng)目中一樣。在某種程度上,它結(jié)合了兩種方法的缺點(diǎn):您不能將庫(kù)用作目標(biāo)(因?yàn)樗鼈兾挥诓煌捻?xiàng)目中),也不能調(diào)用find_package(因?yàn)樵贑MakeLists配置應(yīng)用程序時(shí)未安裝庫(kù))。
#2的一種變體是在外部項(xiàng)目中構(gòu)建庫(kù),但不是安裝工件,而是從源/構(gòu)建位置使用它們。有關(guān)此的更多信息,請(qǐng)參見export()命令。

TA貢獻(xiàn)1841條經(jīng)驗(yàn) 獲得超3個(gè)贊
方法1:我喜歡您對(duì)target_include_directories()
命令的使用(CMake> = 2.8.12),這肯定使事情變得更容易。但是我正在尋找一種解決方案,其中庫(kù)的用戶不需要知道內(nèi)部依賴項(xiàng)。方法2:我將研究使用二進(jìn)制傳遞和find_package()
命令。您能推薦任何有用的鏈接嗎?

TA貢獻(xiàn)1815條經(jīng)驗(yàn) 獲得超6個(gè)贊
關(guān)于ExternalProject
模塊:ExternalProject_Add()
如果我們談?wù)摳蟮恼w庫(kù),我認(rèn)為該命令是可行的。但是對(duì)于我的50多個(gè)較小的庫(kù),我不認(rèn)為這是一個(gè)選擇,并且在某種程度上說(shuō),不打算以這種方式使用它的說(shuō)法在這里也適用。開銷是很大的:例如,我擔(dān)心它-如果我使用該SOURCE_DIR
選項(xiàng)-將啟動(dòng)每個(gè)庫(kù)的編譯器檢測(cè),并且我必須傳遞所有特定于構(gòu)建環(huán)境的選項(xiàng),包括。我的工具鏈文件
- 3 回答
- 0 關(guān)注
- 482 瀏覽
添加回答
舉報(bào)