必威体育Betway必威体育官网
当前位置:首页 > IT技术

ROS Catkin 教程之 catkin_package(...) 到底在做什么?

时间:2019-07-15 03:41:03来源:IT技术作者:seo实验室小编阅读:70次「手机版」
 

catkin

while looking at a CMakeLists.txt file, I was wondering the exact meaning of the catkin_DEPENDS option of the catkin_package(...) macro was.

I would expect to see there the same packages as listed in the find_package(...) macro but this does not seem to be the case.

Answer:

DEPENDSCATKIN_DEPENDS 用来告诉 catkin 需要将你程序包的哪些依赖项传递给使用 find_package(...) 查找你的程序包的程序包。

例如,假设你 find_package(Boost requireD),并在你的安装的头文件中 #include <boost/function.hpp>。为使一个依赖于你的程序包的程序包能构建和连接你的头文件,它们需要在自己的 include 路径中包含 Boost 的 include 目录,还需要连接 Boost 的库。由于你已经在头文件中导出了该依赖,它们应该能从你那里获得依赖。也就是它们不再需要 find_package(Boost REQUIRED) ,因为它们是使用你的包构建的,而不是直接使用 Boost。

你的程序包依赖于 Boost 这一事实是一个实现细节,因此当一些包通过 find_package(...) 查找你的包时,它们能间接获得对 Boost 的依赖。让这种机制起作用方法是在你的 catkin_package(...) 调用中加入 DEPENDS Boost。在内部,catkin 将 find_package(Boost),并向 ${your_pkg_LIBRARIES} 添加 ${Boost_LIBRARIES} ,向 ${your_pkg_INCLUDE_DIRS} 添加 ${Boost_INCLUDE_DIRS}

我们应该注意,catkin 将 find_package() 你告诉它的确切的程序包名, 然后尝试使用该包的 _LIBRARIES_INCLUDE_DIRS 变量。但是 find_package(...) 得到的结果变量的形式并不总是这样,因为 CMake 没有强制执行此操作。例如当 find_package(...) Python 时,find_package(PythonLibs REQUIRED) 的结果变量的形式为 PYTHON_INCLUDE_PATHfind_package(OpenGL REQUIRED) 的结果变量为 OPENGL_INCLUDE_DIR。除了变量前缀变得不一样(PythonLibs -> PYTHON),后缀也变得不标准(PYTHON_INCLUDE_PATH and OPENGL_INCLUDE_DIR vs *_INCLUDE_DIRS)。在这种情况下你就需要使用 INCLUDE_DIRS 选项和 LIBRARIES 选项了。

CATKIN_DEPENDS 选项和 DEPENDS 选项十分相似,但是你只能在其列表中放置 catkin 程序包。将 catkin 依赖设置为一个单独的选项的好处是可以让 catkin 执行一些额外的检查,然后警告你有什么不妥的做法。

最后,给个简单的示例 CMakeLists.txt:

cmake_Minimum_required(VERSION 2.8.3)
project(foo)

find_package(Boost REQUIRED componentS
  system
  thread
)

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(Boost...) 并将它传递给 catkin_package()DEPENDS 部分,因为它生成的是兼容 CMake 的变量。我 find_package(PythonLibs...) 并在内部使用它,但是不用将它传递给 catkin_package(),因为我没有在我任何导出的头文件中包含它。我 find_package(OpenGL...) ,由于它不是兼容 CMake 的变量,所以我将其显示地传递给 catkin_package()NCLUDE_DIRSLIBRARIES 部分。最后,我 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 的隐式依赖。

相关阅读

Microsoft Office2010 安装包永久激活和安装方法

安装包:链接: https://pan.baidu.com/s/1lt-lKTne5G7fZQ7vLfoe1w 提取码: 6dzm各位看官大家好,Microsoft Office 一直作为一款办公

Microsoft Project 2010 (附密钥) 中文破解版

Microsoft Project 2010是由微软开发销售的项目管理软件程序,Project 2010设计目的在于协助项目经理发展计划、为任务分配资源、跟

除了Lily、Rose,还有哪些小众但好听的花名适合做英文名

记得实习的时候,入职的第一家公司要求给个英文名,尴尬了,从来没有想过个自己起个英文名,匆匆忙忙给自己找了个大众化的名

如何解决“无法开始调试 无法找到 Microsoft Internet

方法如下:1、随便在你的工程里面找一个页面,右键点之,选浏览方式,把IE设为默认的2、在最上面的菜单中的选择项目/web/配置属性/调试/

Kerberos学习(四)

Mac下安装配置Kerberos了解一下。公司强迫开发人员全部使用mbp,我很不爽,因为mac下面使用mit的kerberos简直是灾难,申请用普通笔记本

分享到:

栏目导航

推荐阅读

热门阅读