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 @ 2021-11-12 00:09  TNTksals  阅读(305)  评论(0编辑  收藏  举报