ROS中CMakeList.txt的一個例子

## 操作系統中安裝的cmake的最低版本
cmake_minimum_required(VERSION 2.8.3)
## project項是功能包的名稱,需要與package.xml中輸入的一致
project(myrobot_gazebo)

## Compile as C++11, supported in ROS Kinetic and newer
# add_compile_options(-std=c++11)

## 查找構建所需的其他CMake / Catkin 程序包
## fing_package項是進行構建所需的catkin程序包,我們正在使用catkin構建系統,因此肯定要輸入catkin
## 另外呢,這裏還需要填上用戶先創建依賴包的選項
## 若一個包被find_package了,那麼就會導致一些CMake變量的產生
## 這些變量後面將在CMake的腳本中用到,這些變量描述了所依賴的包輸出的頭文件、源文件、庫文件在哪裏
## 這些變量的名字依照的慣例是<PACKAGENAME>_<PROPERTY>,比如
## <NAME>_FOUND:這個變量說明這個庫是否被找到,如果找到就被設置爲true,否則設爲false;
## <NAME>_INCLUDE_DIRS or<NAME>_INCLUDES:這個包輸出的頭文件目錄;
## <NAME>_LIBRARIES or <NAME>_LIBS:這個包輸出的庫文件。
find_package(catkin REQUIRED
    gazebo_msgs
    gazebo_plugins
    gazebo_ros
    gazebo_ros_control
)
## 按照上面的find_package格式將多個包填寫後,它會把所有pacakge裏面的頭文件和庫文件等等目錄加到一組變量上,比如:catkin_INCLUDE_DIRS
## 這樣,我們就可以用這個變量查找需要的文件了。最終就只產生一組變量了。
## 另外,find_package額外包含了哪些依賴包,相應的package.xml文件build_depend與run_depend就必須包含


## 這裏是使用ROS以外功能包時使用的方法CMake程序包
## 例如使用Boost時必須安裝system功能包
# find_package(Boost REQUIRED COMPONENTS system)


## 是在使用python,也就是使用rospy時的配置選項
## 其功能是調用python安裝過程setup.py
# catkin_python_setup()

################################################
## Declare ROS messages, services and actions ##
################################################
## 消息(.msg),服務(.srv)和動作(.action)文件在ROS包構建和使用之前需要一個特殊的預處理器構建步驟
## 這些宏的要點是生成編程語言特定的文件,以便可以利用其選擇的編程語言中的消息,服務和動作。
## 這些宏後面必須跟着一個調用generate_messages()。且這些宏必須在catkin_package()宏前面

## add_message_files是添加消息文件選項
## FILES將引用當前功能包目錄的msg文件夾中的**.msg文件,並自動生成一個頭文件
## 這個註釋掉的例子是說,我們將使用消息文件Message1.msg和Message2.msg
# add_message_files(
#   FILES
#   Message1.msg
#   Message2.msg
# )

## add_service_files是添加要使用的服務文件選項
## FILES會引用功能包目錄中的srv文件夾中的**.srv文件
## 這個註釋掉的例子是說,我們將使用服務文件Service1.srv和Service2.srv
# add_service_files(
#   FILES
#   Service1.srv
#   Service2.srv
# )

## add_action_files是添加要使用的服務文件選項
## FILES會引用功能包目錄中的action文件夾中的**.action文件
## 這個註釋掉的例子是說,我們將使用服務文件Action1.action和Action2.action
# add_action_files(
#   FILES
#   Action1.action
#   Action2.action
# )

## Generate added messages and services with any dependencies listed here
# generate_messages(
#   DEPENDENCIES
#   std_msgs  # Or other packages containing msgs
# )

################################################
## Declare ROS dynamic reconfigure parameters ##
################################################

## 使用dynamic_reconfigure時加載要引用的配置文件的設置(不太懂)
# generate_dynamic_reconfigure_options(
#   cfg/DynReconf1.cfg
#   cfg/DynReconf2.cfg
# )

###################################
## catkin specific configuration ##
###################################

## 下面就是catkin構建選項
## 這是爲構建系統指定catkin特定信息所必需的,以便進一步應用於生成pkg-config和CMake文件。在使用add_library()或add_executable()聲明任何目標之前,必須調用此函數。該函數有5個可選參數: 

## INCLUDE_DIRS表示將使用INCLUDE_DIRS後面的內部目錄include的頭文件,也就是這個catkin包的頭文件是導出到include這個文件夾,include位置是位於該功能包目錄下(需要手動創建)就是當前編寫的CMakeList.txt所在位置,與msg、srv、package.xml、CMakeList.txt共存的位置。與工作空間下(有src、build、devel的位置)devel文件下的include不同,那個有包含由msg文件生成的消息、服務的頭文件

## LIBRARIES表示將使用隨後而來的功能包的庫,就是做成一個庫給別的功能包用
## CATKIN_DEPENDS後面指定例如roscpp或者std_msgs等依賴包,簡單來說要填的內容就是該功能包運行時所需要的、所依賴的catkin包。它與package.xml中標籤xxxx對應。運行和編譯時的依賴不一樣,所以說findpackage()與catkin_package(CATKIN_DEPEND xxx)所跟的依賴是略有不同的
## DEPENDS是一個描述系統依賴包的設置,這個包運行時所依賴的包如果不屬於catkin包的話就要寫在這裏
catkin_package(
#  INCLUDE_DIRS include
#  LIBRARIES myrobot_gazebo
#  CATKIN_DEPENDS other_catkin_pkg
#  DEPENDS system_lib
)

###########
## Build ## 建立庫/可執行文件
###########

## include_directories是指定頭文件的搜索路徑
## 下面設定爲${catkin_INCLUDE_DIRS}表示將引用每個功能包中的include目錄中的頭文件
## 當用戶想指定一個額外的include目錄時,寫在${catkin_INCLUDE_DIRS}的下一行就行
include_directories(
# include
# ${catkin_INCLUDE_DIRS}
)

## Declare a C++ library
## 聲明構建之後需要創建的庫
## 下面是引用myrobot_gazebo功能包的src文件夾中的myrobot_gazebo.cpp文件來創建myrobot_gazebo庫的命令
# add_library(${PROJECT_NAME}
#   src/${PROJECT_NAME}/myrobot_gazebo.cpp
# )

## 在構建該庫和可執行文件之前
## 如果有預先生成的有依賴性消息或dynamic_reconfigure,則要先執行
# add_dependencies(${PROJECT_NAME} ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})

## add_executable是對於構建之後要生成創建的可執行文件的選項
## 下面是引用src/myrobot_gazebo_node.cpp文件生成myrobot_gazebo_node可執行文件
## 如果有多個要引用的**.cpp文件,將其寫在myrobot_gazebo_node.cpp之後
## 如果要創建兩個以上的可執行文件,需要追加add_executable項目
# add_executable(${PROJECT_NAME}_node src/myrobot_gazebo_node.cpp)

## target的命名:
## target的命名很重要,在catkin中target的名字必須是唯一的,和你之前構建產生的和安裝的都不能相同。這只是cmake內部的需要。可以利用set_target_properties()函數將以個target進行重命名。例如:
## set_target_properties(rviz_image_view
##                      PROPERTIES OUTPUT_NAME image_view
##                      PREFIX "")
## 這樣就可以把那個target   rviz_image_view 改爲image_view。
# set_target_properties(${PROJECT_NAME}_node PROPERTIES OUTPUT_NAME node PREFIX "")

## Add cmake target dependencies of the executable
## same as for the library above
# add_dependencies(${PROJECT_NAME}_node ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})

## 這個選項通常和add_executable放在一起
## 是在創建特定的可執行文件之前,將庫和可執行文件進行鏈接的選項
# target_link_libraries(${PROJECT_NAME}_node
#   ${catkin_LIBRARIES}
# )

#############
## Install ##
#############

# all install targets should use catkin DESTINATION variables
# See http://ros.org/doc/api/catkin/html/adv_user_guide/variables.html

## Mark executable scripts (Python etc.) for installation
## in contrast to setup.py, you can choose the destination
# install(PROGRAMS
#   scripts/my_python_script
#   DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
# )

## Mark executables and/or libraries for installation
# install(TARGETS ${PROJECT_NAME} ${PROJECT_NAME}_node
#   ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
#   LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
#   RUNTIME DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
# )

## Mark cpp header files for installation
# install(DIRECTORY include/${PROJECT_NAME}/
#   DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION}
#   FILES_MATCHING PATTERN "*.h"
#   PATTERN ".svn" EXCLUDE
# )

## Mark other files for installation (e.g. launch and bag files, etc.)
# install(FILES
#   # myfile1
#   # myfile2
#   DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}
# )

#############
## Testing ##
#############

## Add gtest based cpp test target and link libraries
# catkin_add_gtest(${PROJECT_NAME}-test test/test_myrobot_gazebo.cpp)
# if(TARGET ${PROJECT_NAME}-test)
#   target_link_libraries(${PROJECT_NAME}-test ${PROJECT_NAME})
# endif()

## Add folders to be run by python nosetests
# catkin_add_nosetests(test)

參考

ROS中的CMakeLists.txt

ROS學習之CMakelists.txt和package.xml

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章