У нас есть несколько узлов, использующих 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>
какая у вас версия ROS?
Я не знаю, почему кто-то дал мне отрицательный ответ, но добавление add_dependencies(foo package_containing_generated_messages_generate_messages_cpp)
должно быть вашим решением. другая ссылка
@ Tik0, я попробую в понедельник. Спасибо!
Почти правильно, но вам не хватает одной важной зависимости. Вот пример, основанный на вашем фрагменте, создающем узел 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) . Спасибо!!
Вы должны разделить связанные пакеты, которые используют сообщения друг друга, поэтому вы должны создать пакет, включающий все сообщения, и завершить его CMakalist.txt как генерацию msg, а затем использовать его в других пакетах.