我目前正试图在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>
文件: 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>
答案 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说,如果目标名称与已安装的名称不符,则当前中断) ,所以我想它目前还没有被编写来处理接口库。