Как настроить CMakeLists и package.xml для зависимостей сгенерированных сообщений?

У нас есть несколько узлов, использующих message_generation для генерации файлов сообщений .h для использования другими узлами. Как правильно включить сгенерированные сообщения в CMakeLists и package.xml не генерирующих пакетов?

В настоящее время я делаю следующее, но всегда терплю неудачу при сборке в первый раз, затем мне приходится перестраивать, и это работает во второй раз. Как будто он не понимает, что сначала должен сгенерировать сообщения. Возможно, вместо этого что-то неправильно настроено в пакете package_containing_generated_messages?


CMakeLists.txt:

find_package(catkin REQUIRED 
    roscpp
    package_containing_generated_messages
)

catkin_package(CATKIN_DEPENDS 
    roscpp 
    package_containing_generated_messages  #I don't think this one is needed, is it?
)

package.xml:

<build_depend>package_containing_generated_messages</build_depend>
<exec_depend>package_containing_generated_messages</exec_depend>

Вы должны разделить связанные пакеты, которые используют сообщения друг друга, поэтому вы должны создать пакет, включающий все сообщения, и завершить его CMakalist.txt как генерацию msg, а затем использовать его в других пакетах.

Benyamin Jafari 20.07.2018 10:17

какая у вас версия ROS?

Benyamin Jafari 20.07.2018 10:17

Я не знаю, почему кто-то дал мне отрицательный ответ, но добавление add_dependencies(foo package_containing_generated_messages_generate_messages_cpp) должно быть вашим решением. другая ссылка

Tik0 21.07.2018 12:28

@ Tik0, я попробую в понедельник. Спасибо!

CodeMonkey 21.07.2018 15:57
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
4
967
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Почти правильно, но вам не хватает одной важной зависимости. Вот пример, основанный на вашем фрагменте, создающем узел foo с вашими собственными сообщениями (но не забывайте, что зависимости в package.xml также имеют решающее значение, но вы все равно исправили их.):

cmake_minimum_required(VERSION 2.8.3)
project(foo_package)

find_package(catkin REQUIRED 
    roscpp
    package_containing_generated_messages
)

catkin_package(CATKIN_DEPENDS 
    roscpp 
    package_containing_generated_messages
)

include_directories(include
  ${catkin_INCLUDE_DIRS}
)

## Declare a cpp executable
add_executable(foo foo.cpp)

## Add cmake target dependencies of the executable/library
## as an example, message headers may need to be generated before nodes
add_dependencies(foo package_containing_generated_messages_generate_messages_cpp)

## Specify libraries to link a library or executable target against
target_link_libraries(foo
  ${catkin_LIBRARIES}
)

Важная строчка - это add_dependencies(foo package_containing_generated_messages_generate_messages_cpp), который проверяет наличие флага package_containing_generated_messages_generate_messages_cpp перед попыткой сборки foo. Поэтому он гарантирует, что заголовки сообщений создаются перед построением двоичного файла. Обратите внимание, что ROS добавляет суффикс к именам ваших пакетов, например <my_msgs_package_name>_generate_messages_cpp. Вот ссылка.

Да, ответ заключался в добавлении add_dependencies (foo package_contain_generated_messages_generate_messages_cpp) ‌. Спасибо!!

CodeMonkey 23.07.2018 16:13

Другие вопросы по теме