中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

catkin_package()的使用方法

發布時間:2020-06-18 19:28:59 來源:網絡 閱讀:1684 作者:nineteens 欄目:開發技術

  DEPENDS 和 CATKIN_DEPENDS 用來告訴 catkin 需要將你程序包A的哪些依賴項傳遞給使用 find_package(...) 查找你的程序包的程序包B。

  而在CMakeLists.txt中正好可以找到find_package()和catkin_package(),也就是說,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()

  例如,假設你 find_package(Boost REQUIRED),并在你的安裝的頭文件中有代碼行 #include 。為使一個依賴于你的擁有#include的程序包能使用你的頭文件,它們需要在自己的 include 路徑中包含 Boost 的 include目錄(其實在visual c++中#include該頭文件是不是同理),還需要連接 Boost 的庫(同前文注釋)。由于你已經在頭文件中導出(是從程序中的#include導出的嗎?)(難道說在visual c++中的#include是一級操作,接下來的操作是生成類CMakeLists.txt這樣的文件?)該依賴,它們應該能從你那里獲得依賴。也就是它們不再需要 find_package(Boost REQUIRED)(也就是依賴一個包,而被依賴的這個包不需要重復聲明它的依賴項) ,因為它們是使用你的包構建的,而不是直接使用 Boost。

  你的程序包(是一級依賴還是二級依賴?從后文看,應該是一級依賴)依賴于 Boost 這一事實是一個實現細節,因此當一些包(一級包)通過 find_package(...) 查找你的包(二級包)時,它們(一級包)能間接獲得對 Boost 的依賴。讓這種機制起作用方法是在你的 catkin_package(...) 調用中加入 DEPENDS Boost參數(在二級包中)(加上DEPENDS Boost就能依賴于被依賴包的依賴項)。其實現細節是:

  catkin 將 find_package(Boost)(作用于全局)

  并向 ${your_pkg_LIBRARIES} 添加 ${Boost_LIBRARIES}(作用于一級包)

  向 ${your_pkg_INCLUDE_DIRS} 添加 ${Boost_INCLUDE_DIRS}。(作用于二級包)

  your_pkg_LIBRARIES應該是使用Boost的包,結合上文應該是為這個包的運行環境維護了很多變量,比說x現在說到的your_pkg_LIBRARIES。

  我們應該注意,catkin 將 find_package() 你告訴它的確切的程序包名, 然后嘗試使用該包的 _LIBRARIES 和 _INCLUDE_DIRS 變量(證明每一個庫還在UBUNTU環境下還擁有很多變量)。但是 find_package(...) 得到的結果變量的形式并不總是這樣(結合下文,應該說的是變量名稱不是固定的),因為 CMake 沒有強制執行此操作(這句話的意思應該是CMake沒有強制約定命名規則?)。例如當 find_package python包時,find_package(PythonLibs REQUIRED) 的結果變量的形式為:PYTHON_INCLUDE_PATH(這是對your_pkg_DIRS進行賦值之后的值,PYTHON_INDLUDE_PATH對應Boost_INCLUDE_DIRS,應該注意的是,它們的命名規則是不一致的,如果一致的話,PYTHON_INCLUDE_PATH應該叫PYTHON_INCLUDE_DIRS)。

  find_package(OpenGL REQUIRED) 的結果變量為 OPENGL_INCLUDE_DIR。(這個時候命名規則與添加Boost庫的例子又一致了)。

  除了變量前綴變得不一樣(PythonLibs -> PYTHON),后綴也變得不標準(PYTHON_INCLUDE_PATH and OPENGL_INCLUDE_DIR vs *_INCLUDE_DIRS,在這句話中有三種后綴,分別是PATH和DIR以及DIRS)。在這種情況下你就需要使用INCLUDE_DIRS 選項將傳遞包含頭文件目錄的變量到catkin_package()中(這個變量的意思是include dirs),同理LIBRARIES選項也是干的類似的事情。

  CATKIN_DEPENDS 選項和 DEPENDS 選項十分相似,但是對于CATKIN_DEDPENS來說,你只能在其列表中放置 catkin 程序包(即是用roscreate-pkg創建的程序包)。將 catkin 依賴設置為一個單獨的選項的好處是可以讓 catkin 執行一些額外的檢查,然后警告你有什么不妥的做法。

  最后,給個簡單的示例 CMakeLists.txt:

  cmake_minimum_required(VERSION 2.8.3)

  project(foo)

  find_package(Boost REQUIRED COMPONENTS

  system

  thread

  )無錫好的×××醫院 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))。因為它(catkin_package())生成的是兼容 CMake 的變量(變量格式一致???)。

  在CMakeLists.txt文件中find_package(PythonLibs REQUIRED),但是不用將它傳遞給 catkin_package(),因為我沒有在我任何暴露給外界的頭文件中包含它。我 find_package(OpenGL...) ,由于它生成的不是兼容 CMake 的變量,所以我將其顯示地傳遞給 catkin_package() 的 INCLUDE_DIRS 和 LIBRARIES 部分,(不用變量了,直接賦值)。最后,我 find_package(catkin ... rosconsole roscpp,并在內部使用,但是我可能只在 .c* 文件中使用了 rosconsole,因此我不用傳遞它,所以 catkin_package() 的 CATKIN_DEPENDS 部分我只需放入 roscpp。

  最后要說明但是,如果一個程序包有直接使用像 Boost 這樣的依賴項,那么它們應該確保用 find_package(...) 顯示地查找它,而不是通過其他包隱式地依賴于它。舉個這樣的例子,如果程序包 foo 將 Boost 作為依賴項導出,又有程序包 bar 依賴于 foo,但也在內部使用 Boost,那么 bar 即使在沒有顯示依賴 Boost 的情況下也能編譯正常。 但后來 foo 可能決定重構并刪除了它對 Boost 的依賴,那么現在 bar 將無法編譯,因為它不再具有通過 foo 傳遞來的對 Boost 的隱式依賴。


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

政和县| 白城市| 方山县| 山丹县| 奎屯市| 松潘县| 禄劝| 海南省| 襄樊市| 开封市| 濮阳县| 肇东市| 浪卡子县| 丹江口市| 黑山县| 镇康县| 宿松县| 伊宁县| 正镶白旗| 会泽县| 娱乐| 丰县| 英德市| 碌曲县| 正镶白旗| 临朐县| 盐边县| 牟定县| 保山市| 重庆市| 临高县| 石门县| 翁源县| 永嘉县| 霍州市| 卢龙县| 临泽县| 山东省| 盘锦市| 临桂县| 任丘市|