CMakeLists.txt(ROS)

CMakeLists.txt

简介

  • CMakeLists.txt文件是CMake编译系统编译软件包过程的输入文件
  • 任何CMake兼容包都包含一个或多个CMakeLists.txt文件,这些文件描述了如何编译代码以及将其安装到哪里
  • 用于 catkin 项目的 CMakeLists.txt 文件是一个标准的 vanilla CMakeLists.txt 文件,带有一些额外的约束

整体结构和顺序

  • cmake_minimum_required:设置CMake最低版本
  • project():功能包名称
  • find_package():查找编译依赖的其他CMake/Catkin包(声明依赖库)
  • catkin_python_setup():启动Python模块支持
  • add_message_files(), add_service_files(), add_action_files():消息/服务/操作 (Message/Service/Action) 生成
  • generate_messages():调用消息/服务/操作生成
  • catkin_package():指定包编译信息导出
  • add_library()/add_executable()/target_link_libraries():添加要编译的库和可执行文件
  • catkin_add_gtest():测试编译
  • install():安装规则

解析

  • 设置CMake的最低版本
cmake_minimum_required(VERSION 3.10)
  • 设置工程名称
project(catkin_ws)
# CMake中,可以通过使用变量${PROJECT_NAME}在CMake脚本后面的任何位置引用项目名称
  • 默认使用C++14版本
set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED TRUE)
  • 为当前目录及以下目录的源代码向编译器命令行添加标志(flag)
add_definitions(-Wall -Werror)
# 通过添加 -Wall 和 -Werror,让编译器不再忽略警告,强制执行更干净的代码
  • 添加子目录
add_subdirectory(Folder)
# 将子目录Folder添加到build中
  • 指定编译软件包所需的包(必须在package.xml中列出)
find_package(catkin REQUIRED COMPONENTS
roscpp
sensor_msgs
)
  • 声明要编译的msg文件
add_message_files(
FILES
MyMessage1.msg
MyMessage2.msg
)
  • 声明要编译的srv文件
add_service_files(
FILES
MyService.srv
)
  • 声明要编译的action文件
add_action_files(
FILES
DoDishes.action
)
  • 生成不同语言版本的msg/srv/action接口
generate_messages(
DEPENDENCIES
std_msgs
std_srvs
actionlib_msgs
)
  • 指定编译信息
catkin_package(
INCLUDE_DIRS include # 软件包导出的头文件路径
#LIBRARIES // 在此项目中导出的库
CATKIN_DEPENDS roscpp sensor_msgs # 指定依赖于此包的catkin运行依赖
#DEPENDS // 外部函数库,系统依赖项
)
# 该函数必须在使用 add_library()或add_executable()声明任何targets之前调用
  • 将给定的目录添加到编译器用于搜索头文件的目录中
include_directories(
include
${catkin_INCLUDE_DIRS}
# Set manually because Eigen sets a non standard INCLUDE DIR
${EIGEN3_INCLUDE_DIR}
# Set because Boost is an internal dependency, not transitive.
${Boost_INCLUDE_DIRS}
)
  • 指定用于编译的库文件,默认情况下,catkin编译共享库
add_library(libanswer STATIC OtherFile.cpp)
# STATIC,代表静态链接库,编译的时候link到工程中静态库是.a文件
# SHARED,代表动态链接库,运行时候加载,使用共享库的程序只引用它在共享库中使用的代码,共享库是.so文件
  • 声明为一个可执行文件,这个节点带有两个src文件
add_executable(${PROJECT_NAME} main.cpp OtherFile.cpp)
  • 指定链接可执行文件的库
target_link_libraries(${PROJECT_NAME} ${catkin_LIBRARIES})
  • 添加显式依赖项,以使它们按照正确的顺序编译
add_dependencies(${PROJECT_NAME} libanswer)
# 一个顶层target是由命令add_executable,add_library,或者add_custom_target产生的目标
# 定义目标target依赖于其他目标target,确保其他target已被build,让一个顶层target依赖于其他的顶层target
# 用到的情况就是两个targets有依赖关系(通过target_link_libraries解决)并且依赖库也是通过编译源码产生的
# 这时候一句add_dependencies可以在直接编译上层target时,自动检查下层依赖库是否已经生成.没有的话先编译下层依赖库,然后再编译上层target,最后link depend target
  • 明确安装目标
# Mark executables and/or libraries for installation
install(
TARGETS ${PROJECT_NAME}
ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
RUNTIME DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
)
# TARGETS:要安装的目标
# ARCHIVE DESTINATION:静态库和动态链接库DLL(Windows).lib存根
# LIBRARY DESTINATION:非DLL共享库和模块
# RUNTIME DESTINATION:可执行目标和DLL(Windows)模式共享库
  • 安装头文件
# Mark cpp header files for installation
install(
DIRECTORY include/${PROJECT_NAME}/
DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION}
FILES_MATCHING PATTERN "*.h"
)
# 头文件必须安装到include目录下,这通常通过安装整个文件夹的文件来完成
  • 安装其他文件
# Mark other files for installation
install(
DIRECTORY config launch
DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}
)


如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的“推荐”将是我最大的写作动力!欢迎各位转载,但是未经作者本人同意,转载文章之后必须在文章页面明显位置给出作者和原文连接,否则保留追究法律责任的权利。
posted @   TNTksals  阅读(332)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示