在 ROS1 中,CMakeLists.txt
是一个关键文件,用于定义如何构建和编译你的 ROS 包。以下是一个典型的 ROS1 CMakeLists.txt
文件的主要部分及其作用说明。
1. cmake_minimum_required
cmake_minimum_required(VERSION 3.0.2)
- 作用: 指定所需的最小 CMake 版本。ROS1 Noetic 通常使用 3.0.2 或更高版本。确保 CMake 构建系统在合适的版本上运行。
2. project
project(my_ros_pkg)
- 作用: 声明项目的名称。这里的项目名
my_ros_pkg
通常与包名保持一致。CMake 将使用该名称作为生成构建系统的标识。
3. find_package
find_package(catkin REQUIRED COMPONENTS
roscpp
std_msgs
)
- 作用: 查找并加载指定的 catkin 包及其依赖项。
REQUIRED
表示这些组件是必需的,COMPONENTS
关键字后列出的是你项目依赖的 ROS 包。常用的组件有roscpp
(用于 C++ 开发),std_msgs
(标准消息类型包)等。
4. catkin_package
catkin_package(
CATKIN_DEPENDS roscpp std_msgs
)
- 作用: 定义你的项目作为 catkin 包,并声明该包对其他包的依赖。
CATKIN_DEPENDS
中列出的包表明此包在运行时或编译时依赖于这些 ROS 包。catkin_package()
还会自动为该包生成必要的配置文件,使得其他 ROS 包可以依赖该包。
5. include_directories
include_directories(
include
${catkin_INCLUDE_DIRS}
)
- 作用: 定义编译时需要包含的头文件目录。
include
是你的包的头文件路径,${catkin_INCLUDE_DIRS}
是catkin
和其他依赖包的头文件路径,它们在运行find_package(catkin ...)
后会自动获取。
6. add_executable
add_executable(${PROJECT_NAME}_node src/main.cpp)
- 作用: 定义一个可执行文件。
add_executable
用于将源文件(如src/main.cpp
)编译为一个可执行程序。在这个例子中,${PROJECT_NAME}_node
会解析为my_ros_pkg_node
,即生成的可执行文件的名称。
7. target_link_libraries
target_link_libraries(${PROJECT_NAME}_node
${catkin_LIBRARIES}
)
- 作用: 将生成的可执行文件与所需的库进行链接。
${catkin_LIBRARIES}
是所有由catkin_package()
和find_package()
中列出的依赖包所提供的库。它确保你的 ROS 程序在运行时能够访问所有需要的库函数。
8. add_dependencies
add_dependencies(${PROJECT_NAME}_node ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
- 作用: 指定该节点的依赖关系。如果你有自动生成的消息、服务或动作文件,或者依赖于其他包的生成目标,
add_dependencies
可以确保在编译过程中正确处理这些依赖,保证生成的目标文件按顺序编译。
9. 消息、服务和动作生成
如果你的包定义了自定义的消息、服务或动作文件,你还需要在 CMakeLists.txt
中进行特殊的处理。
find_package
部分:
find_package(catkin REQUIRED COMPONENTS
roscpp
std_msgs
message_generation
)
添加消息/服务文件:
add_message_files(
FILES
MyMessage.msg
)
add_service_files(
FILES
MyService.srv
)
生成消息、服务和动作:
generate_messages(
DEPENDENCIES
std_msgs
)
添加依赖项:
catkin_package(
CATKIN_DEPENDS message_runtime roscpp std_msgs
)
10. 安装可执行文件
如果你需要安装生成的可执行文件,你可以添加如下命令:
install(TARGETS ${PROJECT_NAME}_node
RUNTIME DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
)
- 作用: 将生成的可执行文件安装到
catkin
的二进制目录中。
11. 编译选项
如果你需要设置编译器的选项(如使用 C++11 标准),可以添加如下编译选项:
add_compile_options(-std=c++11)
- 作用: 这里是让你的编译器支持 C++11 标准。如果你使用现代 C++,比如 ROS Noetic,则应设置为
C++14
或C++17
。
12. 自定义安装路径
如果你有需要安装的配置文件或其他资源,可以使用以下命令:
install(DIRECTORY launch/
DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}/launch
)
- 作用: 将
launch
文件夹中的文件安装到指定路径中。常用于将启动文件安装到catkin
的共享目录中。
示例完整的 CMakeLists.txt
文件
cmake_minimum_required(VERSION 3.0.2)
project(my_ros_pkg)
find_package(catkin REQUIRED COMPONENTS
roscpp
std_msgs
)
catkin_package(
CATKIN_DEPENDS roscpp std_msgs
)
include_directories(
include
${catkin_INCLUDE_DIRS}
)
add_executable(${PROJECT_NAME}_node src/main.cpp)
target_link_libraries(${PROJECT_NAME}_node
${catkin_LIBRARIES}
)
add_dependencies(${PROJECT_NAME}_node ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
install(TARGETS ${PROJECT_NAME}_node
RUNTIME DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
)
install(DIRECTORY launch/
DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}/launch
)
总结
cmake_minimum_required
和project
用于定义基本的 CMake 项目。find_package
查找并加载 ROS 依赖包。catkin_package
声明此包是一个 catkin 包,并处理依赖关系。add_executable
和target_link_libraries
用于生成并链接 ROS 节点。add_dependencies
确保所有依赖的生成目标按顺序编译。- 安装规则
install
用于安装可执行文件和其他资源。
通过这些声明,你可以创建一个功能完善的 ROS1 包,并且能够与 ROS 库和其他工具正确链接。
近期评论