3 回答

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

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

TA貢獻1815條經驗 獲得超6個贊
關于ExternalProject
模塊:ExternalProject_Add()
如果我們談論更大的整體庫,我認為該命令是可行的。但是對于我的50多個較小的庫,我不認為這是一個選擇,并且在某種程度上說,不打算以這種方式使用它的說法在這里也適用。開銷是很大的:例如,我擔心它-如果我使用該SOURCE_DIR
選項-將啟動每個庫的編譯器檢測,并且我必須傳遞所有特定于構建環境的選項,包括。我的工具鏈文件
- 3 回答
- 0 關注
- 473 瀏覽
添加回答
舉報