【问题标题】:Using Catkin with CMake Interface Library将 Catkin 与 CMake 接口库一起使用
【发布时间】:2019-04-15 11:50:20
【问题描述】:

我目前正在尝试使用在 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.txtpackage.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>

测试节点

文件: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>

【问题讨论】:

    标签: c++ cmake ros catkin


    【解决方案1】:

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

    This answer 提到LIBRARIES 行要求您实际上是在构建一个目标(并且the documentation 说如果目标名称与安装的名称不对应,它当前会中断),所以我猜它只是目前不是为处理接口库而编写的。

    【讨论】:

      【解决方案2】:

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

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

      catkin config --merge-devel

      并手动将其搜索区域扩展到您的主 ROS 文件夹(默认为 /opt/ros/&lt;your-version&gt;)和您可以使用的其他 catkin 工作区:

      catkin config --expand &lt;path-to-ros-workspace&gt;

      然后添加您的项目并构建。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-07-12
        • 2023-03-21
        • 2017-03-25
        • 2017-04-16
        • 1970-01-01
        • 2015-04-08
        • 2019-01-07
        相关资源
        最近更新 更多