DEPENDS 和 CATKIN_DEPENDS 用來(lái)告訴 catkin 需要將你程序包A的哪些依賴項(xiàng)傳遞給使用 find_package(...) 查找你的程序包的程序包B。
公司主營(yíng)業(yè)務(wù):成都網(wǎng)站建設(shè)、網(wǎng)站制作、移動(dòng)網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競(jìng)爭(zhēng)能力。成都創(chuàng)新互聯(lián)公司是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對(duì)我們的高要求,感謝他們從不同領(lǐng)域給我們帶來(lái)的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會(huì)用頭腦與智慧不斷的給客戶帶來(lái)驚喜。成都創(chuàng)新互聯(lián)公司推出盱眙免費(fèi)做網(wǎng)站回饋大家。而在CMakeLists.txt中正好可以找到find_package()和catkin_package(),也就是說(shuō),catkin_package()是作用在find_package()中的。
1 cmake_minimum_required(VERSION 2.8.3)
2 project(beginner_tutorials)
3
4 ## Find catkin and any catkin packages
5 find_package(catkin REQUIRED COMPONENTS roscpp rospy std_msgs genmsg)
6
7 ## Declare ROS messages and services
8 add_message_files(DIRECTORY msg FILES Num.msg)
9 add_service_files(DIRECTORY srv FILES AddTwoInts.srv)
10
11 ## Generate added messages and services
12 generate_messages(DEPENDENCIES std_msgs)
13
14 ## Declare a catkin package
15 catkin_package()
例如,假設(shè)你 find_package(Boost REQUIRED),并在你的安裝的頭文件中有代碼行 #include 。為使一個(gè)依賴于你的擁有#include的程序包能使用你的頭文件,它們需要在自己的 include 路徑中包含 Boost 的 include目錄(其實(shí)在visual c++中#include該頭文件是不是同理),還需要連接 Boost 的庫(kù)(同前文注釋)。由于你已經(jīng)在頭文件中導(dǎo)出(是從程序中的#include導(dǎo)出的嗎?)(難道說(shuō)在visual c++中的#include是一級(jí)操作,接下來(lái)的操作是生成類CMakeLists.txt這樣的文件?)該依賴,它們應(yīng)該能從你那里獲得依賴。也就是它們不再需要 find_package(Boost REQUIRED)(也就是依賴一個(gè)包,而被依賴的這個(gè)包不需要重復(fù)聲明它的依賴項(xiàng)) ,因?yàn)樗鼈兪鞘褂媚愕陌鼧?gòu)建的,而不是直接使用 Boost。
你的程序包(是一級(jí)依賴還是二級(jí)依賴?從后文看,應(yīng)該是一級(jí)依賴)依賴于 Boost 這一事實(shí)是一個(gè)實(shí)現(xiàn)細(xì)節(jié),因此當(dāng)一些包(一級(jí)包)通過 find_package(...) 查找你的包(二級(jí)包)時(shí),它們(一級(jí)包)能間接獲得對(duì) Boost 的依賴。讓這種機(jī)制起作用方法是在你的 catkin_package(...) 調(diào)用中加入 DEPENDS Boost參數(shù)(在二級(jí)包中)(加上DEPENDS Boost就能依賴于被依賴包的依賴項(xiàng))。其實(shí)現(xiàn)細(xì)節(jié)是:
catkin 將 find_package(Boost)(作用于全局)
并向 ${your_pkg_LIBRARIES} 添加 ${Boost_LIBRARIES}(作用于一級(jí)包)
向 ${your_pkg_INCLUDE_DIRS} 添加 ${Boost_INCLUDE_DIRS}。(作用于二級(jí)包)
your_pkg_LIBRARIES應(yīng)該是使用Boost的包,結(jié)合上文應(yīng)該是為這個(gè)包的運(yùn)行環(huán)境維護(hù)了很多變量,比說(shuō)x現(xiàn)在說(shuō)到的your_pkg_LIBRARIES。
我們應(yīng)該注意,catkin 將 find_package() 你告訴它的確切的程序包名, 然后嘗試使用該包的 _LIBRARIES 和 _INCLUDE_DIRS 變量(證明每一個(gè)庫(kù)還在UBUNTU環(huán)境下還擁有很多變量)。但是 find_package(...) 得到的結(jié)果變量的形式并不總是這樣(結(jié)合下文,應(yīng)該說(shuō)的是變量名稱不是固定的),因?yàn)?CMake 沒有強(qiáng)制執(zhí)行此操作(這句話的意思應(yīng)該是CMake沒有強(qiáng)制約定命名規(guī)則?)。例如當(dāng) find_package python包時(shí),find_package(PythonLibs REQUIRED) 的結(jié)果變量的形式為:PYTHON_INCLUDE_PATH(這是對(duì)your_pkg_DIRS進(jìn)行賦值之后的值,PYTHON_INDLUDE_PATH對(duì)應(yīng)Boost_INCLUDE_DIRS,應(yīng)該注意的是,它們的命名規(guī)則是不一致的,如果一致的話,PYTHON_INCLUDE_PATH應(yīng)該叫PYTHON_INCLUDE_DIRS)。
find_package(OpenGL REQUIRED) 的結(jié)果變量為 OPENGL_INCLUDE_DIR。(這個(gè)時(shí)候命名規(guī)則與添加Boost庫(kù)的例子又一致了)。
除了變量前綴變得不一樣(PythonLibs -> PYTHON),后綴也變得不標(biāo)準(zhǔn)(PYTHON_INCLUDE_PATH and OPENGL_INCLUDE_DIR vs *_INCLUDE_DIRS,在這句話中有三種后綴,分別是PATH和DIR以及DIRS)。在這種情況下你就需要使用INCLUDE_DIRS 選項(xiàng)將傳遞包含頭文件目錄的變量到catkin_package()中(這個(gè)變量的意思是include dirs),同理LIBRARIES選項(xiàng)也是干的類似的事情。
CATKIN_DEPENDS 選項(xiàng)和 DEPENDS 選項(xiàng)十分相似,但是對(duì)于CATKIN_DEDPENS來(lái)說(shuō),你只能在其列表中放置 catkin 程序包(即是用roscreate-pkg創(chuàng)建的程序包)。將 catkin 依賴設(shè)置為一個(gè)單獨(dú)的選項(xiàng)的好處是可以讓 catkin 執(zhí)行一些額外的檢查,然后警告你有什么不妥的做法。
最后,給個(gè)簡(jiǎn)單的示例 CMakeLists.txt:
cmake_minimum_required(VERSION 2.8.3)
project(foo)
find_package(Boost REQUIRED COMPONENTS
system
thread
)無(wú)錫好的×××醫(yī)院 http://www.zzch220.com/
find_package(PythonLibs REQUIRED)
find_package(OpenGL REQUIRED)
find_package(catkin REQUIRED COMPONENTS
rosconsole
roscpp
)
include_directories(
include
${catkin_INCLUDE_DIRS}
${OPENGL_INCLUDE_DIR}
${PYTHON_INCLUDE_PATH}
)
catkin_package(
INCLUDE_DIRS include ${OPENGL_INCLUDE_DIR}
LIBRARIES foo ${OPENGL_LIBRARIES}
CATKIN_DEPENDS roscpp
DEPENDS Boost
)
...
此例中你可以看到我 find_package(find_package(Boost REQUIRED COMPONENTS))并將它傳遞給 catkin_package() 的 DEPENDS 部分(catkin_package(DEPENDS Boost))。因?yàn)樗?catkin_package())生成的是兼容 CMake 的變量(變量格式一致???)。
在CMakeLists.txt文件中find_package(PythonLibs REQUIRED),但是不用將它傳遞給 catkin_package(),因?yàn)槲覜]有在我任何暴露給外界的頭文件中包含它。我 find_package(OpenGL...) ,由于它生成的不是兼容 CMake 的變量,所以我將其顯示地傳遞給 catkin_package() 的 INCLUDE_DIRS 和 LIBRARIES 部分,(不用變量了,直接賦值)。最后,我 find_package(catkin ... rosconsole roscpp,并在內(nèi)部使用,但是我可能只在 .c* 文件中使用了 rosconsole,因此我不用傳遞它,所以 catkin_package() 的 CATKIN_DEPENDS 部分我只需放入 roscpp。
最后要說(shuō)明但是,如果一個(gè)程序包有直接使用像 Boost 這樣的依賴項(xiàng),那么它們應(yīng)該確保用 find_package(...) 顯示地查找它,而不是通過其他包隱式地依賴于它。舉個(gè)這樣的例子,如果程序包 foo 將 Boost 作為依賴項(xiàng)導(dǎo)出,又有程序包 bar 依賴于 foo,但也在內(nèi)部使用 Boost,那么 bar 即使在沒有顯示依賴 Boost 的情況下也能編譯正常。 但后來(lái) foo 可能決定重構(gòu)并刪除了它對(duì) Boost 的依賴,那么現(xiàn)在 bar 將無(wú)法編譯,因?yàn)樗辉倬哂型ㄟ^ foo 傳遞來(lái)的對(duì) Boost 的隱式依賴。
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。