如何为生成的消息依赖项设置 CMakeLists 和 package.xml?

How to setup CMakeLists and package.xml for generated message dependencies?

我们有多个节点使用 message_generation 生成 .h 消息文件供其他节点使用。将生成的消息包含在非生成包的 CMakeListspackage.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>

几乎正确,但您缺少一个关键依赖项。 这是一个基于您使用自己的消息构建节点 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),它确保在尝试构建 foo 之前标志 package_containing_generated_messages_generate_messages_cpp 存在。因此,它确保在构建二进制文件之前生成消息 headers。请注意,ROS 会为您的包名称添加一个后缀,例如 <my_msgs_package_name>_generate_messages_cppHere is some reference.