# 2.4 CMakeLists.txt
## 2.4.1 CMakeLists.txt作用
`CMakeLists.txt`原本是Cmake編譯系統的規則文件,而Catkin編譯系統基本沿用了CMake的編譯風格,只是針對ROS工程添加了一些宏定義。所以在寫法上,catkin的`CMakeLists.txt`與CMake的基本一致。
這個文件直接規定了這個package要依賴哪些package,要編譯生成哪些目標,如何編譯等等流程。所以`CMakeLists.txt`非常重要,它指定了由源碼到目標文件的規則,catkin編譯系統在工作時首先會找到每個package下的`CMakeLists.txt`,然后按照規則來編譯構建。
## 2.4.1 CMakeLists.txt寫法
`CMakeLists.txt`的基本語法都還是按照CMake,而Catkin在其中加入了少量的宏,總體的結構如下:
```cmake
cmake_minimum_required() #CMake的版本號
project() #項目名稱
find_package() #找到編譯需要的其他CMake/Catkin package
catkin_python_setup() #catkin新加宏,打開catkin的Python Module的支持
add_message_files() #catkin新加宏,添加自定義Message/Service/Action文件
add_service_files()
add_action_files()
generate_message() #catkin新加宏,生成不同語言版本的msg/srv/action接口
catkin_package() #catkin新加宏,生成當前package的cmake配置,供依賴本包的其他軟件包調用
add_library() #生成庫
add_executable() #生成可執行二進制文件
add_dependencies() #定義目標文件依賴于其他目標文件,確保其他目標已被構建
target_link_libraries() #鏈接
catkin_add_gtest() #catkin新加宏,生成測試
install() #安裝至本機
```
如果你從未接觸過CMake的語法,請閱讀《CMake實踐》:[https://github.com/Akagi201/learning-cmake/blob/master/docs/cmake-practice.pdf](https://github.com/Akagi201/learning-cmake/blob/master/docs/cmake-practice.pdf) 。掌握CMake語法對于理解ROS工程很有幫助。
## 2.4.2 CMakeLists例子
為了詳細的解釋`CMakeLists.txt`的寫法,我們以turtlesim小海龜這個pacakge為例,讀者可`roscd`到`tuetlesim`包下查看,在`turtlesim/CMakeLists.txt`的寫法如下,:
```
cmake_minimum_required(VERSION 2.8.3)
#CMake至少為2.8.3版
project(turtlesim)
#項目(package)名稱為turtlesim,在后續文件中可使用變量${PROJECT_NAME}來引用項目名稱turltesim
find_package(catkin REQUIRED COMPONENTS geometry_msgs message_generation rosconsole roscpp roscpp_serialization roslib rostime std_msgs std_srvs)
#cmake宏,指定依賴的其他pacakge,實際是生成了一些環境變量,如<NAME>_FOUND, <NAME>_INCLUDE_DIRS, <NAME>_LIBRARYIS
#此處catkin是必備依賴 其余的geometry_msgs...為組件
find_package(Qt5Widgets REQUIRED)
find_package(Boost REQUIRED COMPONENTS thread)
include_directories(include ${catkin_INCLUDE_DIRS} ${Boost_INCLUDE_DIRS})
#指定C++的頭文件路徑
link_directories(${catkin_LIBRARY_DIRS})
#指定鏈接庫的路徑
add_message_files(DIRECTORY msg FILES
Color.msg Pose.msg)
#自定義msg文件
add_service_files(DIRECTORY srv FILES
Kill.srv
SetPen.srv
Spawn.srv
TeleportAbsolute.srv
TeleportRelative.srv)
#自定義srv文件
generate_messages(DEPENDENCIES geometry_msgs std_msgs std_srvs)
#在add_message_files、add_service_files宏之后必須加上這句話,用于生成srv msg頭文件/module,生成的文件位于devel/include中
catkin_package(CATKIN_DEPENDS geometry_msgs message_runtime std_msgs std_srvs)
# catkin宏命令,用于配置ROS的package配置文件和CMake文件
# 這個命令必須在add_library()或者add_executable()之前調用,該函數有5個可選參數:
# (1) INCLUDE_DIRS - 導出包的include路徑
# (2) LIBRARIES - 導出項目中的庫
# (3) CATKIN_DEPENDS - 該項目依賴的其他catkin項目
# (4) DEPENDS - 該項目所依賴的非catkin CMake項目。
# (5) CFG_EXTRAS - 其他配置選項
set(turtlesim_node_SRCS
src/turtlesim.cpp
src/turtle.cpp
src/turtle_frame.cpp
)
set(turtlesim_node_HDRS
include/turtlesim/turtle_frame.h
)
#指定turtlesim_node_SRCS、turtlesim_node_HDRS變量
qt5_wrap_cpp(turtlesim_node_MOCS ${turtlesim_node_HDRS})
add_executable(turtlesim_node ${turtlesim_node_SRCS} ${turtlesim_node_MOCS})
# 指定可執行文件目標turtlesim_node
target_link_libraries(turtlesim_node Qt5::Widgets ${catkin_LIBRARIES} ${Boost_LIBRARIES})
# 指定鏈接可執行文件
add_dependencies(turtlesim_node turtlesim_gencpp)
add_executable(turtle_teleop_key tutorials/teleop_turtle_key.cpp)
target_link_libraries(turtle_teleop_key ${catkin_LIBRARIES})
add_dependencies(turtle_teleop_key turtlesim_gencpp)
add_executable(draw_square tutorials/draw_square.cpp)
target_link_libraries(draw_square ${catkin_LIBRARIES} ${Boost_LIBRARIES})
add_dependencies(draw_square turtlesim_gencpp)
add_executable(mimic tutorials/mimic.cpp)
target_link_libraries(mimic ${catkin_LIBRARIES})
add_dependencies(mimic turtlesim_gencpp)
# 同樣指定可執行目標、鏈接、依賴
install(TARGETS turtlesim_node turtle_teleop_key draw_square mimic
RUNTIME DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION})
# 安裝目標文件到本地系統
install(DIRECTORY images
DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}
FILES_MATCHING PATTERN "*.png" PATTERN "*.svg")
```
- 前言
- 第一章 ROS簡介
- 機器人時代的到來
- ROS發展歷程
- 什么是ROS
- 安裝ROS
- 安裝ROS-Academy-for-Beginners教學包
- 二進制與源碼包
- 安裝RoboWare Studio
- 單元測試一
- 第二章 ROS文件系統
- Catkin編譯系統
- Catkin工作空間
- Package軟件包
- CMakeLists.txt
- package.xml
- Metapacakge軟件元包
- 其他常見文件類型
- 單元測試二
- 第三章 ROS通信架構(一)
- Node & Master
- Launch文件
- Topic
- Msg
- 常見msg類型
- 單元測試三
- 第四章 ROS通信架構(二)
- Service
- Srv
- Parameter server
- Action
- 常見srv類型
- 常見action類型
- 單元測試四
- 第五章 常用工具
- Gazebo
- RViz
- Rqt
- Rosbag
- Rosbridge
- moveit!
- 單元測試五
- 第六章 roscpp
- Client Library與roscpp
- 節點初始、關閉與NodeHandle
- Topic in roscpp
- Service in roscpp
- Param in roscpp
- 時鐘
- 日志與異常
- 第七章 rospy
- Rospy與主要接口
- Topic in rospy
- Service in rospy
- Param與Time
- 第八章 TF與URDF
- 認識TF
- TF消息
- tf in c++
- tf in python
- 統一機器人描述格式
- 附錄:TF數學基礎
- 三維空間剛體運動---旋轉矩陣
- 三維空間剛體運動---歐拉角
- 三維空間剛體運動---四元數
- 第九章 SLAM
- 地圖
- Gmapping
- Karto
- Hector
- 第十章 Navigation
- Navigation Stack
- move_base
- costmap
- Map_server & Amcl
- 附錄:Navigation工具包說明
- amcl
- local_base_planner
- carrot_planner
- clear_costmap_recovery
- costmap_2d
- dwa_local_planner
- fake_localization
- global_planner
- map_server
- move_base_msg
- move_base
- move_slow_and_clear
- navfn
- nav_core
- robot_pose_ekf
- rotate_recovery