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

猜你喜欢

转载自blog.csdn.net/qq_26565435/article/details/105130788