第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

CMake:如何設(shè)置源,庫(kù)和CMakeLists.txt依賴項(xiàng)?

CMake:如何設(shè)置源,庫(kù)和CMakeLists.txt依賴項(xiàng)?

C++
慕田峪9158850 2019-12-16 13:12:59
我有好幾個(gè)項(xiàng)目(所有項(xiàng)目都是從同一個(gè)源樹結(jié)構(gòu)中使用CMake構(gòu)建的)都使用了自己的數(shù)十種支持庫(kù)。所以我想到了一個(gè)問(wèn)題,如何在CMake中正確設(shè)置它。到目前為止,我僅發(fā)現(xiàn)CMake如何正確地在目標(biāo)之間創(chuàng)建依賴關(guān)系,但是我仍然在設(shè)置具有全局依賴關(guān)系(項(xiàng)目級(jí)別確實(shí)了解全部)或具有本地依賴關(guān)系(每個(gè)子級(jí)別目標(biāo)僅處理其目標(biāo))之間進(jìn)行掙扎自己的依賴項(xiàng))。這里是我的目錄結(jié)構(gòu)的簡(jiǎn)化例子,我現(xiàn)在想出了使用CMake和本地依賴性(例子中只有一個(gè)可執(zhí)行的項(xiàng)目,App1但也有更多的實(shí)際,App2,App3等):Lib+-- LibA    +-- Inc        +-- a.h    +-- Src        +-- a.cc    +-- CMakeLists.txt+-- LibB    +-- Inc        +-- b.h    +-- Src        +-- b.cc    +-- CMakeLists.txt+-- LibC    +-- Inc        +-- c.h    +-- Src        +-- c.cc    +-- CMakeLists.txtApp1+-- Src    +-- main.cc+-- CMakeLists.txtLib / LibA / CMakeLists.txtinclude_directories(Inc ../LibC/Inc)add_subdirectory(../LibC LibC)add_library(LibA Src/a.cc Inc/a.h)target_link_libraries(LibA LibC)Lib / LibB / CMakeLists.txtinclude_directories(Inc)add_library(LibB Src/b.cc Inc/b.h)Lib / LibC / CMakeLists.txtinclude_directories(Inc ../LibB/Inc)add_subdirectory(../LibB LibB)add_library(LibC Src/c.cc Inc/c.h)target_link_libraries(LibC LibB)App1 / CMakeLists.txt(為便于復(fù)制,我在此處生成源/頭文件)cmake_minimum_required(VERSION 2.8)project(App1 CXX)file(WRITE "Src/main.cc" "#include \"a.h\"\n#include \"b.h\"\nint main()\n{\na();\nb();\nreturn 0;\n}")file(WRITE "../Lib/LibA/Inc/a.h" "void a();")file(WRITE "../Lib/LibA/Src/a.cc" "#include \"c.h\"\nvoid a()\n{\nc();\n}")file(WRITE "../Lib/LibB/Inc/b.h" "void b();")file(WRITE "../Lib/LibB/Src/b.cc" "void b() {}")file(WRITE "../Lib/LibC/Inc/c.h" "void c();")file(WRITE "../Lib/LibC/Src/c.cc" "#include \"b.h\"\nvoid c()\n{\nb();\n}")include_directories(    ../Lib/LibA/Inc    ../Lib/LibB/Inc)目前,我更喜歡本地依賴項(xiàng)變體,因?yàn)樗子谑褂谩N抑皇褂媒o出源級(jí)別的依賴關(guān)系,使用給出include_directories()鏈接級(jí)別的依賴關(guān)系,使用target_link_libraries()CMake級(jí)別給出依賴關(guān)系add_subdirectory()。這樣,您就無(wú)需知道支持庫(kù)之間的依賴關(guān)系,并且-有了CMake級(jí)別的“包含”,您最終只會(huì)使用真正使用的目標(biāo)。可以肯定的是,您只需使所有包含目錄和目標(biāo)都為全局已知,然后讓編譯器/鏈接器將其余的分類即可。但這對(duì)我來(lái)說(shuō)似乎是一種腹脹。我還嘗試使用a Lib/CMakeLists.txt來(lái)處理Lib目錄樹中的所有依賴關(guān)系,但是最終我進(jìn)行了很多if ("${PROJECT_NAME}" STREQUAL ...)檢查,并遇到了一個(gè)問(wèn)題,即如果不給出至少一個(gè)源文件,就無(wú)法創(chuàng)建將目標(biāo)分組的中間庫(kù)。
查看完整描述

3 回答

?
慕蓋茨4494581

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()命令。



查看完整回答
反對(duì) 回復(fù) 2019-12-17
?
偶然的你

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()命令。您能推薦任何有用的鏈接嗎?

查看完整回答
反對(duì) 回復(fù) 2019-12-17
?
紅糖糍粑

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),包括。我的工具鏈文件

查看完整回答
反對(duì) 回復(fù) 2019-12-17
  • 3 回答
  • 0 關(guān)注
  • 482 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)