很多小白宝宝第一次接触ROS开发,在写代码编译的时候不懂CMakeLists.txt
究竟是干什么的,本文对CMakeLists.txt
文件进行详解。
这篇文章告诉你每一行是干嘛的。
CMakeLists.txt
是 CMake 构建系统的配置文件,用于定义项目的构建规则和依赖关系。CMakeLists.txt
是 CMake 的核心文件,用户通过这个文件告诉 CMake 如何构建项目。这个文件通常包括设置项目名称、版本号、语言标准、编译器选项、查找依赖包、添加可执行文件或库、链接依赖库、安装路径等。
每一行代码的解释如下:
版本要求:
cmake_minimum_required(VERSION 3.5)
这行代码设置了 CMake 的最低版本要求。CMake 是一个跨平台的构建工具,不同的版本可能有不同的功能。这行代码确保用户使用的 CMake 版本不低于 3.5,以保证项目能够正确构建。
项目名称:
project(demo_cpp_pkg)
这行代码定义了项目的名称。项目的名称在构建过程中会用到,例如生成的库或可执行文件的名称通常会包含项目名称。
CMakeLists.txt
和 package.xml
中的名称要一致,不然会报错!!!!
指定标准:
if(NOT CMAKE_C_STANDARD)
set(CMAKE_C_STANDARD 99)
endif()
if(NOT CMAKE_CXX_STANDARD)
set(CMAKE_CXX_STANDARD 14)
endif()
这行代码设置了默认的 C 和 C++ 标准。如果没有明确指定标准,CMake 会使用 C99
作为默认的 C 标准,C++14
作为默认的 C++ 标准。
编译选项:
if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")
add_compile_options(-Wall -Wextra -Wpedantic)
endif()
这行代码为特定的编译器(如 GNU C++ 和 Clang)添加编译选项。-Wall
和 -Wextra
会启用更多的编译警告,-Wpedantic
会启用严格的 ISO C++ 标准检查。
查找依赖包:
find_package(ament_cmake REQUIRED)
find_package(rclcpp REQUIRED)
find_package(std_msgs REQUIRED)
这行代码查找项目所需的依赖包。find_package
是 CMake 的一个命令,用于查找和加载外部库或包。REQUIRED
表示如果没有找到这些包,CMake 将报错。
添加可执行文件:
add_executable(talker src/talker.cpp)
这行代码添加一个可执行文件,talker 是可执行文件的名称,src/talker.cpp 是源文件的路径。
添加依赖:
ament_target_dependencies(talker rclcpp std_msgs)
这行代码将可执行文件 talker
链接到依赖库 rclcpp
和 std_msgs
。
下载位置:
install(TARGETS
talker
DESTINATION lib/${PROJECT_NAME}
)
这行代码指定了可执行文件的安装路径。lib/${PROJECT_NAME}
是典型的 ROS 2 安装路径。
例子
好了,你已经学会了文件中所有代码的意思了,接下来给你个例子看一下,没有注释,但结合上文,你应该能看懂。
cmake_minimum_required(VERSION 3.8)
project(demo_cpp_pkg)
if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")
add_compile_options(-Wall -Wextra -Wpedantic)
endif()
find_package(ament_cmake REQUIRED)
find_package(rclcpp REQUIRED)
add_executable(person_node src/person_node)
ament_target_dependencies(person_node rclcpp)
install(TARGETS
person_node
DESTINATION lib/${PROJECT_NAME}
)
if(BUILD_TESTING)
find_package(ament_lint_auto REQUIRED)
set(ament_cmake_copyright_FOUND TRUE)
set(ament_cmake_cpplint_FOUND TRUE)
ament_lint_auto_find_test_dependencies()
endif()
ament_package()