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_minimum_required(VERSION 3.10)
project(catkin_ws)
# CMake中,可以通过使用变量${PROJECT_NAME}在CMake脚本后面的任何位置引用项目名称
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
)
add_message_files(
FILES
MyMessage1.msg
MyMessage2.msg
)
add_service_files(
FILES
MyService.srv
)
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文件
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}
)