如何在catkin包中包装系统库/依赖项,然后使用该包在其他包中提供系统库?

时间:2014-04-17 15:27:15

标签: cmake ros

我的计算机上安装了一个系统库,例如OpenCV 3.0.0(例如),/opt/OpenCV3

我想在我自己的包opencv3中包装OpenCV的依赖项。这样我可以像这样使用catkin:

find_package(catkin REQUIRED COMPONENTS
  opencv3
)

所以我继续创建了opencv3包。我能够找到系统库的外部.cmake文件和构建。以下是opencv3 CMakeLists.txt的重要部分:

cmake_minimum_required(VERSION 2.8.3)
set(CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH} "/opt/OpenCV3")
...
find_package(catkin REQUIRED)
find_package(OpenCV 3.0.0 EXACT)
...
catkin_package(
#  INCLUDE_DIRS include
#  LIBRARIES opencv3
#  CATKIN_DEPENDS
   DEPENDS OpenCV
)

现在,当我将自定义包opencv3包含在其他包作为依赖项时,其他包找不到OpenCV库,因此无法链接/构建!但是,OpenCV包含的目录确实转移到其他包。因此,当我在CMakeLists.txt其他使用opencv3的软件包中使用此代码时,

message(STATUS ${opencv3_INCLUDE_DIRS})

我得到了输出:

/opt/OpenCV3/include

哪个是对的。我只是无法找出DEPENDS(...)的catkin_package字段如何使系统依赖库转移到新包。 catkin_LIBRARIESopencv3_LIBRARIES中没有OpenCV库......

1 个答案:

答案 0 :(得分:0)

我最终按照此处的说明操作:http://docs.ros.org/hydro/api/catkin/html/howto/system_library_dependencies.html

即使我使用find_package()查找OpenCV,导出的OpenCV_LIBRARIES变量也不包含库文件的完整路径,只包括名称。这导致库不会显示在包含我的opencv3包的其他包中。

解决方案是创建一个包含OpenCV库的完整路径的变量,并将该变量放在LIBRARIES()的catkin_package部分中。只有这样,依赖于opencv3的包能够正确链接和构建。

我对此解决方案感到非常满意,但它仍然需要我创建一个自定义变量,其中包含所有OpenCV库的绝对路径。我宁愿在DEPENDS OpenCV()中使用catkin_package并完成它。