首页 > 解决方案 > 如何为生成的消息依赖项设置 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?
)

包.xml:

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

标签: cmakeros

解决方案


几乎是正确的,但是您缺少一个关键的依赖项。这是一个基于您的代码段的示例,该代码段使用您自己的消息构建节点 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)确保标志存在的这一行。因此,它确保在构建二进制文件之前生成消息头。请注意,ROS 会为您的包名称添加一个后缀,例如. 这里有一些参考package_containing_generated_messages_generate_messages_cppfoo<my_msgs_package_name>_generate_messages_cpp


推荐阅读