catkin_package - yuhannah/skills_map GitHub Wiki

关于 DEPENDS 和 CATKIN_DEPENDS 的一段解释的理解

catkin_depends

你的package中依赖boost,即 find_package(Boost REQUIRED) 并且在install目录中的头文件中有 #include <boost/function.hpp> 的代码,别人在 find_package(你的package) 的时候,需要从你的package里获得boost依赖,而不需要重新 find_package(Boost REQUIRED) 。

那么在实现这种依赖的传递的方式,就是把 boost 放到 catkin_package() 中。

另外,对于同一个 find_package() 命令,产生的变量名称并不统一,比如:

find_package(PythonLibs REQUIRED)

产生 PYTHON_INCLUDE_PATH 变量

find_package(OpenGl REQUIRED)

产生 OPENGL_INCLUDE_DIR 变量

以上的不同导致需要人为传递这些对应的变量,即在 catkin_package() 中添加 PYTHON_INCLUDE_PATH 或者 OPENGL_INCLUDE_DIR。

另外,DEPENDS 和 CATKIN_DEPENDS 的差别是,只能将依赖 catkin 的 package 放在列表中,其他的仅依赖 cmake 的 package 放在 DEPENDS 列表中。这样 catkin 会提供更多的检查。

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
)

举例的补充:

1.Boost 作为 CMake 变量的依赖,在 DEPENDS 列表传递

2.roscpp 作为 catkin 变量的依赖,在 CATKIN_DEPENDS 列表传递

3.rosconsole 不需要传递,不在列表中

4.PythonLibs 不需要传递,install 里面没有对应的头文件,不需要传递

5.OpenGL 不需要编译,只包含头文件和库,分别在 INCLUDE_DIRS 传递头文件,在 LIBRARIES 传递库文件

最后一个例子,上述 package 依赖 Boost ,使用这个 package 的人如果不额外调用 Boost,上述没有问题。如果需要额外调用 Boost,还需要显示添加 find_package(Boost REQUIRED)。如果不显示添加 Boost 依赖,在首次编译时可能没有问题,在后续的编译时,可能会导致原 package 移除 Boost 依赖,从而导致编译失败。