将 Catkin 与 CMake 接口库一起使用
Using Catkin with CMake Interface Library
我目前正在尝试使用在 catkin 中声明为 cmake 接口库的 c++ header-only 库。这个库应该被 catkin_ws/src 中的其他包使用。我能够使用 catkin_make
编译所有包,但不能使用 catkin build
.
catkin build
在依赖包中的 cmake 命令 find_package(... interface_lib)
中失败。
Error-Message 对于下面的示例将是:
Project 'testnode' tried to find library 'interface_library'. The library
is neither a target nor built/installed properly. Did you compile project
'interface_library'? Did you find_package() it before the subdirectory
containing its code is included?
我需要如何设置 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>
较旧的 catkin 或 catkin_make
使用合并开发 space 但较新的 catkin 或 catkin build
默认使用链接开发 space。
您应该做的第一件事是将 catkin workspace 彼此分开放在 2 个不同的文件夹中。然后设置 change catkin build
's workspace to merged-devel with:
catkin config --merge-devel
并手动将其搜索区域扩展到您的主 ROS 文件夹(/opt/ros/<your-version>
中的默认文件夹)和您可以使用的其他 catkin 作品space:
catkin config --expand <path-to-ros-workspace>
之后添加您的项目并构建。
我刚遇到这个问题。解决方法是从文件 interface_library/CMakeLists.txt.
中的 catkin_package
中删除行 LIBRARIES ${PROJECT_NAME}
This answer mentions that the LIBRARIES
line requires that you're actually building a target (and the documentation 表示如果目标名称与已安装的名称不对应,它目前会中断),所以我猜它目前不是为处理接口库而编写的。
我目前正在尝试使用在 catkin 中声明为 cmake 接口库的 c++ header-only 库。这个库应该被 catkin_ws/src 中的其他包使用。我能够使用 catkin_make
编译所有包,但不能使用 catkin build
.
catkin build
在依赖包中的 cmake 命令 find_package(... interface_lib)
中失败。
Error-Message 对于下面的示例将是:
Project 'testnode' tried to find library 'interface_library'. The library is neither a target nor built/installed properly. Did you compile project 'interface_library'? Did you find_package() it before the subdirectory containing its code is included?
我需要如何设置 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>
较旧的 catkin 或 catkin_make
使用合并开发 space 但较新的 catkin 或 catkin build
默认使用链接开发 space。
您应该做的第一件事是将 catkin workspace 彼此分开放在 2 个不同的文件夹中。然后设置 change catkin build
's workspace to merged-devel with:
catkin config --merge-devel
并手动将其搜索区域扩展到您的主 ROS 文件夹(/opt/ros/<your-version>
中的默认文件夹)和您可以使用的其他 catkin 作品space:
catkin config --expand <path-to-ros-workspace>
之后添加您的项目并构建。
我刚遇到这个问题。解决方法是从文件 interface_library/CMakeLists.txt.
中的catkin_package
中删除行 LIBRARIES ${PROJECT_NAME}
This answer mentions that the LIBRARIES
line requires that you're actually building a target (and the documentation 表示如果目标名称与已安装的名称不对应,它目前会中断),所以我猜它目前不是为处理接口库而编写的。