Использование Catkin с библиотекой интерфейса CMake - PullRequest
0 голосов
/ 12 ноября 2018

В настоящее время я пытаюсь использовать библиотеку c ++ только для заголовков, объявленную как библиотека интерфейса cmake в catkin. Предполагается, что эта библиотека будет использоваться другими пакетами в catkin_ws / src . Я смог скомпилировать все пакеты с catkin_make, но не с catkin build.

catkin build завершается ошибкой в ​​команде cmake find_package(... interface_lib) в зависимых пакетах.

Сообщение об ошибке для приведенного ниже примера будет:

Проект 'testnode' попытался найти библиотеку 'interface_library'. Библиотека не является ни целью, ни построен / установлен правильно. Вы скомпилировали проект? 'Interface_library'? Вы нашли _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 голосов
/ 20 июня 2019

Я только что столкнулся с этой проблемой.Исправление состояло в том, чтобы удалить строку LIBRARIES ${PROJECT_NAME} из catkin_package в файле interface_library / CMakeLists.txt.

В этом ответе упоминается, что строка LIBRARIES требует, чтобы вы на самом делесоздание цели (и документация говорит, что в настоящее время она ломается, если имя цели не соответствует установленному имени), поэтому я думаю, что в данный момент она не написана для работы с интерфейсными библиотеками.

0 голосов
/ 21 ноября 2018

старая версия 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>

, после этого добавьте свои проекты и соберите.

...