【ROS2CMakeLists的常见内容】
#1.CMake版本固定cmake_minimum_required(VERSION3.8)#2.功能包名与package.xml一致project(advanced_pkg)# 自动创建两个变量后续可直接使用 # ${PROJECT_NAME}本CMakeLists.txt的project名称 # ${PROJECT_SOURCE_DIR}本CMakeLists.txt所在的文件夹路径 #3.C标准设置必须放在所有构建命令之前set(CMAKE_CXX_STANDARD17)# 使用C17标准set(CMAKE_CXX_STANDARD_REQUIRED ON)# 强制要求不允许降级set(CMAKE_CXX_EXTENSIONS OFF)# 禁用编译器特有的GNU扩展 #4.编译选项可选if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHESClang)add_compile_options(-Wall-Wextra-Wpedantic)endif()# 设置默认构建类型为 Release如果未指定if(NOT CMAKE_BUILD_TYPE)set(CMAKE_BUILD_TYPE Release CACHE STRINGBuild typeFORCE)message(STATUSBuild type set to Release by default)endif()#5.寻找依赖不变find_package(ament_cmake REQUIRED)find_package(rclcpp REQUIRED)find_package(std_msgs REQUIRED)find_package(rosidl_default_generators REQUIRED)#用于生成自定义 msg/srv # 第三方库find_package(Eigen3 REQUIRED)find_package(OpenCV REQUIRED)find_package(Sophus REQUIRED)find_package(Boost REQUIRED COMPONENTS thread)#使用库的部分内容#find_package(xxx REQUIRED)会生成一些可以使用的变量常用的包括#PackageName_FOUND:最重要的变量用于指示包是否被成功找到。如果找到其值为 TRUE #PackageName_INCLUDE_DIRS 或PackageName_INCLUDES:包的头文件包含路径。 #PackageName_LIBRARIES 或PackageName_LIBS:包需要链接的库文件。 #PackageName_DEFINITIONS:使用该包时可能需要添加的预处理器定义。 #6.生成自定义接口msg/srvrosidl_generate_interfaces(${PROJECT_NAME}msg/RobotPose.msg# 自定义消息srv/AddTwoInts.srv# 自定义服务 DEPENDENCIES std_msgs # 如果消息中引用了 std_msgs 类型需列出)#include_directories(include)老版本会加一些第三方库的头文件但是尽量舍弃详细分析见下面的链接#[https://blog.csdn.net/aiccc/article/details/162931080?spm1001.2014.3001.5501]target_include_directories(pose_publisher PRIVATE ${EIGEN3_INCLUDE_DIRS}${OpenCV_INCLUDE_DIRS}${Sophus_INCLUDE_DIRS}# 假设 Sophus 设置了该变量实际可能不同)#7.# 新增生成自定义库动态库供其他节点复用 # 格式add_library(库名 SHARED 库的实现文件)add_library(tool_utils_lib SHARED src/tool_utils.cpp)# 链接库的依赖如果库用到了ROS2的工具需添加ament_target_dependencies(tool_utils_lib rclcpp std_msgs)target_link_libraries(tool_utils_lib ${Boost_LIBRARIES})# 编译多个节点add_executable(pose_publisher src/pose_publisher.cpp)add_executable(add_server src/add_server.cpp)add_executable(add_client src/add_client.cpp)add_executable(node1 src/node1.cpp)add_executable(node2 src/node2.cpp)#8.链接依赖 # 链接自定义接口rosidl_target_interfaces(pose_publisher ${PROJECT_NAME}rosidl_typesupport_cpp)rosidl_target_interfaces(add_server ${PROJECT_NAME}rosidl_typesupport_cpp)rosidl_target_interfaces(add_client ${PROJECT_NAME}rosidl_typesupport_cpp)# 链接基础依赖和自定义库 # 最好用target_link_libraries替代ament_target_dependenciesament_target_dependencies(pose_publisher rclcpp std_msgs)ament_target_dependencies(add_server rclcpp std_msgs)ament_target_dependencies(add_client rclcpp std_msgs)ament_target_dependencies(node1 rclcpp std_msgs)ament_target_dependencies(node2 rclcpp std_msgs)# 自定义库target_link_libraries(node1 tool_utils_lib)target_link_libraries(node2 tool_utils_lib)# 第三方库target_link_libraries(pose_publisher ${OpenCV_LIBRARIES})#9.安装规则 # 安装节点install(TARGETS pose_publisher add_server add_client node1 node2 tool_utils_lib DESTINATION lib/${PROJECT_NAME})# 安装接口、头文件、launch、configinstall(DIRECTORY msg srv DESTINATION share/${PROJECT_NAME}/)install(DIRECTORY include/DESTINATION include)install(DIRECTORY launch config DESTINATION share/${PROJECT_NAME}/)#10.测试if(BUILD_TESTING)find_package(ament_lint_auto REQUIRED)ament_lint_auto_find_test_dependencies()endif()#11.固定结尾ament_package()