ros2迁移c++之package.xml、CMakeLists.txt及编译
1、package.xml
<package> <!--1. 根标签-->
<name> <!--2. 包名-->
<version> <!--3. 版本号-->
<description> <!--4. 包描述-->
<maintainer> <!--5. 维护者-->
<license> <!--6. 软件许可-->
<buildtool_depend> <!--7. 编译构建工具,通常为catkin-->
<depend> <!--8. 指定依赖项为编译、 导出、 运行需要的依赖,最常用的依赖标记。-->
<build_depend> <!--9. 编译依赖项-->
<build_export_depend> <!--10. 导出依赖项-->
<exec_depend> <!--11. 运行依赖项-->
<test_depend> <!--12. 测试用例依赖项-->
<doc_depend> <!--13. 文档依赖项-->
</package> <!--根标签-->
ros2和ros1的基本通用,在ros2中由于编译模式的更改,需要删除catkin
的相关内容,更改为ament_cmake
<!-- ROS1 -->
<buildtool_depend>catkin</buildtool_depend>
<!-- The export tag contains other, unspecified, tags -->
<export>
<!-- Other tools can request additional information be placed here -->
</export>
----------------------------------------------------------------------
<!-- ROS2 -->
<buildtool_depend>ament_cmake</buildtool_depend>
<test_depend>ament_lint_auto</test_depend>
<test_depend>ament_lint_common</test_depend>
<export>
<build_type>ament_cmake</build_type>
</export>
2、CMakeLists.txt
2.1 find_package
# ros1
find_package(catkin REQUIRED COMPONENTS
roscpp
std_msgs
)
catkin_package(
INCLUDE_DIRS include
LIBRARIES test_library
CATKIN_DEPENDS roscpp std_msgs
# DEPENDS system_lib
)
----------------------------------------------------------------------
# ros2
find_package(ament_cmake REQUIRED)
find_package(rclcpp REQUIRED)
find_package(std_msgs REQUIRED)
set(dependencies
rclcpp
std_msgs
)
# ament_target_dependencies是官方推荐的方式去添加依赖项。它将使依赖项的库、头文件和自身的依赖项被正常找到
ament_target_dependencies(
${dependencies}
)
2.2 include_directories
# ros1
include_directories(
include
${catkin_INCLUDE_DIRS}
)
----------------------------------------------------------------------
# ros2
include_directories(
include
)
2.3 动态库
# ros1
add_library(test_library
src/test_library.cpp
)
add_dependencies(test_library ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
target_link_libraries(test_library
${catkin_LIBRARIES}
)
----------------------------------------------------------------------
# ros2
add_library(test_library SHARED
src/test_library.cpp
)
# 通常来说,若依赖项为ROS2功能包时,则使用ament_target_dependencies。若功能包有多个库,它也将一并包含。
ament_target_dependencies(test_library
${dependencies} # dependencies与前面提到的一致
)
# 链接自定义依赖库
target_link_libraries(test_library
lib1
)
2.4 可执行程序
# ros1
add_executable(test_node
src/main.cpp
)
add_dependencies(test_node ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
target_link_libraries(test_node
test_library
${catkin_LIBRARIES}
)
----------------------------------------------------------------------
# ros2
add_executable(test_node
src/main.cpp
)
ament_target_dependencies(test_node
${dependencies}
)
target_link_libraries(test_node
test_library
)
2.5 install库及可执行文件
# ros1
# 安装库
install(TARGETS
lib1
lib2
lib3
ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
RUNTIME DESTINATION ${CATKIN_GLOBAL_BIN_DESTINATION}
)
# 安装可执行文件
install(TARGETS
node1
node2
node3
RUNTIME DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
)
# 安装头文件
install(DIRECTORY
include/${PROJECT_NAME}/
DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION}
FILES_MATCHING PATTERN "*.h"
PATTERN ".svn" EXCLUDE
)
# 安装launch及其他文件
install(DIRECTORY launch
DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}
)
----------------------------------------------------------------------
# ros2---set方法在ros1中也可使用
# 安装库
set(librarys
lib1
lib2
lib3
)
install(TARGETS
${librarys}
ARCHIVE DESTINATION lib
LIBRARY DESTINATION lib
RUNTIME DESTINATION bin
)
# 安装可执行文件
set(nodes
node1
node2
node3
)
install(TARGETS
${nodes}
RUNTIME DESTINATION lib/${PROJECT_NAME}
)
# 安装头文件
install(DIRECTORY include/
DESTINATION include/
)
# 安装launch及其他文件
install(DIRECTORY launch file
DESTINATION share/${PROJECT_NAME}
)
2.6 标记头文件
# ros1
----------------------------------------------------------------------
# ros2
ament_export_include_directories(include)
2.7 供其他节点链接引用
# ros1
catkin_package(
INCLUDE_DIRS include
LIBRARIES lib1 lib2 lib3
CATKIN_DEPENDS roscpp rospy std_msgs
# DEPENDS system_lib
)
----------------------------------------------------------------------
# ros2
set(librarys
lib1
lib2
lib3
)
# 其他的功能包能链接到这些库
ament_export_libraries(${librarys})
# ament_export_dependencies会将依赖项导出到下游软件包
ament_export_dependencies(${dependencies})
2.8 项目安装
# ros1
----------------------------------------------------------------------
# ros2--ament_package是CMakeLists.txt文件中的最后一个调用
ament_package()
3、编译
# ros1
# 编译整个工作空间
catkin_make -DCATKIN_WHITELIST_PACKAGES = ""
# 编译单独节点
catkin_make -DCATKIN_WHITELIST_PACKAGES = "pkg1"
----------------------------------------------------------------------
# ros2--colcon其余命令可自行查阅
# 编译整个工作空间
colcon build --symlink-install
# 编译单独节点
colcon build --packages-select pkg1
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义