将Catkin与CMake接口库一起使用

时间:2018-11-12 17:53:05

标签: c++ cmake ros catkin

我目前正试图在catkin中使用声明为cmake接口库的c ++仅标头库。该库应该由 catkin_ws / src 中的其他软件包使用。我可以用catkin_make编译所有软件包,而不能用catkin build编译。

catkin build在相关软件包的cmake命令find_package(... interface_lib)中失败。

以下示例的错误消息为:

  

项目“ testnode”试图找到库“ interface_library”。图书馆     既不是目标,也不是正确构建/安装的对象。你编译项目了吗     “ interface_library”?您在子目录之前找到过find_package()吗?     是否包含其代码?

我如何设置 CMakeLists.txt package.xml 文件,以使catkin build与接口库一起工作?

最小示例:

接口库

文件: catkin_ws / src / interface_library / include / interface_library.hpp

#pragma once

#define RATE 10

文件: catkin_ws / src / interface_library / CMakeLists.txt

cmake_minimum_required(VERSION 3.0.0)
project(interface_library)

find_package(catkin REQUIRED)

catkin_package(INCLUDE_DIRS include
  LIBRARIES ${PROJECT_NAME})

add_library(${PROJECT_NAME} INTERFACE)
target_include_directories(${PROJECT_NAME} INTERFACE include)

文件: catkin_ws / src / interface_library / package.xml

<package format="2">
  <name>interface_library</name>
  <description>Test interface library</description>
  <version>0.0.1</version>
  <maintainer email="master@disaster.com">Master of Disaster</maintainer>
  <license>MIT</license>
  <buildtool_depend>catkin</buildtool_depend>
</package>

Testnode

文件: catkin_ws / src / testnode / src / testnode.cpp

#include <iostream>
#include "interface_library.hpp"

int main(void)
{
  std::cout << RATE << std::endl;
}

文件: catkin_ws / src / testnode / CMakeLists.txt

cmake_minimum_required(VERSION 3.0.0)
project(testnode)

find_package(catkin REQUIRED COMPONENTS interface_library)

catkin_package()

include_directories(${catkin_INCLUDE_DIRS})

add_executable(${PROJECT_NAME}_node src/testnode.cpp)

文件: catkin_ws / src / testnode / package.xml

<?xml version="1.0"?>
<package format="2">
  <name>testnode</name>
  <version>0.0.0</version>
  <description>The testnode package</description>
  <maintainer email="master@disaster.com">Master of Disaster</maintainer>
  <license>MIT</license>

  <buildtool_depend>catkin</buildtool_depend>
  <build_depend>interface_library</build_depend>
  <build_export_depend>interface_library</build_export_depend>
  <exec_depend>interface_library</exec_depend>
</package>

2 个答案:

答案 0 :(得分:0)

旧的catkin或catkin_make使用合并的开发空间,但较新的catkin或catkin build默认使用链接的开发空间。

您应该做的第一件事是将catkin工作区彼此分开在2个不同的文件夹中。然后将更改catkin build的工作区设置为merged-devel与:

catkin config --merge-devel

,并手动将其搜索区域扩展到您的主ROS文件夹(/opt/ros/<your-version>中的默认文件夹)和其他可用于以下用途的catkin工作区:

catkin config --expand <path-to-ros-workspace>

之后,添加您的项目并进行构建。

答案 1 :(得分:0)

我刚刚遇到了这个问题。解决方法是从文件interface_library / CMakeLists.txt中的LIBRARIES ${PROJECT_NAME}中删除行catkin_package

This answer提到LIBRARIES行要求您实际上是在构建目标(the documentation说,如果目标名称与已安装的名称不符,则当前中断) ,所以我想它目前还没有被编写来处理接口库。