catkin_package - yuhannah/skills_map GitHub Wiki
关于 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 依赖,从而导致编译失败。