如何为生成的消息依赖项设置 CMakeLists 和 package.xml?
How to setup CMakeLists and package.xml for generated message dependencies?
我们有多个节点使用 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>
几乎正确,但您缺少一个关键依赖项。
这是一个基于您使用自己的消息构建节点 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_cpp
。 Here is some reference.
我们有多个节点使用 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>
几乎正确,但您缺少一个关键依赖项。 这是一个基于您使用自己的消息构建节点 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_cpp
。 Here is some reference.