0.目的

cmakelist:用于定义package的编译过程

1.过程

、Required CMake Version (cmake_minimum_required)  //CMake 需要的版本
、Package Name (project()) //#定义工程名称
、Find other CMake/Catkin packages needed for build (find_package()) //寻找需要用到的其他 CMake packages 、Message/Service/Action Generators (add_message_files(), add_service_files(), add_action_files())
、Invoke message/service/action generation (generate_messages())
、Specify package build info export (catkin_package())//catkin 支持的 CMake 宏指令。用来向编译系统指明 catkin-specific 的信息,而编译系统来生成 pkg-config and CMake files。
、Libraries/Executables to build (add_library()/add_executable()/target_link_libraries())
、Tests to build (catkin_add_gtest())
、Install rules (install())

2.示例

amcl_node.cpp的cmakelists.txt

cmake_minimum_required(VERSION 3.1)//Catkin 需要版本 3.1或者更高
project(amcl) //定义工程名称 if(NOT CMAKE_CXX_STANDARD) //设置编译环境
set(CMAKE_CXX_STANDARD )
endif() find_package(catkin REQUIRED//寻找需要用到的其他 CMake packages
COMPONENTS
dynamic_reconfigure
geometry_msgs
message_filters
nav_msgs
rosbag
roscpp
sensor_msgs
std_srvs
tf2
tf2_geometry_msgs
tf2_msgs
tf2_ros
) find_package(Boost REQUIRED) # dynamic reconfigure
generate_dynamic_reconfigure_options(
cfg/AMCL.cfg
) catkin_package(//向编译系统指明 catkin-specific 的信息
CATKIN_DEPENDS
dynamic_reconfigure
geometry_msgs
nav_msgs
rosbag
roscpp
sensor_msgs
std_srvs
tf2
tf2_msgs
tf2_ros
INCLUDE_DIRS include
LIBRARIES amcl_sensors amcl_map amcl_pf
) include_directories(include)//变量为 find_package 路径和其他需要包含的路径
include_directories(${catkin_INCLUDE_DIRS} ${Boost_INCLUDE_DIRS}) add_library(amcl_pf//添加默认共享库
src/amcl/pf/pf.c
src/amcl/pf/pf_kdtree.c
src/amcl/pf/pf_pdf.c
src/amcl/pf/pf_vector.c
src/amcl/pf/eig3.c
src/amcl/pf/pf_draw.c) add_library(amcl_map
src/amcl/map/map.c
src/amcl/map/map_cspace.cpp
src/amcl/map/map_range.c
src/amcl/map/map_store.c
src/amcl/map/map_draw.c) add_library(amcl_sensors
src/amcl/sensors/amcl_sensor.cpp
src/amcl/sensors/amcl_odom.cpp
src/amcl/sensors/amcl_laser.cpp)
target_link_libraries(amcl_sensors amcl_map amcl_pf)//表示前面的库依赖后面的库 add_executable(amcl
src/amcl_node.cpp)
add_dependencies(amcl ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS}) target_link_libraries(amcl
amcl_sensors amcl_map amcl_pf
${Boost_LIBRARIES}
${catkin_LIBRARIES}
) install( TARGETS//生成Makefile中的install target,把这些对应文件拷贝到目标目录下
amcl amcl_sensors amcl_map amcl_pf
ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
RUNTIME DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
) install(DIRECTORY include/amcl/
DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION}
) install(DIRECTORY examples/
DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}/examples
) ## Configure Tests
if(CATKIN_ENABLE_TESTING)
find_package(rostest REQUIRED) # Bags
catkin_download_test_data(${PROJECT_NAME}_basic_localization_stage_indexed.bag
http://download.ros.org/data/amcl/basic_localization_stage_indexed.bag
DESTINATION ${CATKIN_DEVEL_PREFIX}/${CATKIN_PACKAGE_SHARE_DESTINATION}/test
MD5 41fe43af189ec71e5e48eb9ed661a655)
catkin_download_test_data(${PROJECT_NAME}_global_localization_stage_indexed.bag
http://download.ros.org/data/amcl/global_localization_stage_indexed.bag
DESTINATION ${CATKIN_DEVEL_PREFIX}/${CATKIN_PACKAGE_SHARE_DESTINATION}/test
MD5 752f711cf4f6e8d1d660675e2da096b0) //下载文件
catkin_download_test_data(${PROJECT_NAME}_small_loop_prf_indexed.bag
http://download.ros.org/data/amcl/small_loop_prf_indexed.bag
DESTINATION ${CATKIN_DEVEL_PREFIX}/${CATKIN_PACKAGE_SHARE_DESTINATION}/test
MD5 e4ef0fc006872b43f12ed8a7ce7dcd81)
catkin_download_test_data(${PROJECT_NAME}_small_loop_crazy_driving_prg_indexed.bag
http://download.ros.org/data/amcl/small_loop_crazy_driving_prg_indexed.bag
DESTINATION ${CATKIN_DEVEL_PREFIX}/${CATKIN_PACKAGE_SHARE_DESTINATION}/test
MD5 4a58d1a7962914009d99000d06e5939c)
catkin_download_test_data(${PROJECT_NAME}_texas_greenroom_loop_indexed.bag
http://download.ros.org/data/amcl/texas_greenroom_loop_indexed.bag
DESTINATION ${CATKIN_DEVEL_PREFIX}/${CATKIN_PACKAGE_SHARE_DESTINATION}/test
MD5 6e3432115cccdca1247f6c807038e13d)
catkin_download_test_data(${PROJECT_NAME}_texas_willow_hallway_loop_indexed.bag
http://download.ros.org/data/amcl/texas_willow_hallway_loop_indexed.bag
DESTINATION ${CATKIN_DEVEL_PREFIX}/${CATKIN_PACKAGE_SHARE_DESTINATION}/test
MD5 27deb742fdcd3af44cf446f39f2688a8)
catkin_download_test_data(${PROJECT_NAME}_rosie_localization_stage.bag
http://download.ros.org/data/amcl/rosie_localization_stage.bag
DESTINATION ${CATKIN_DEVEL_PREFIX}/${CATKIN_PACKAGE_SHARE_DESTINATION}/test
MD5 3347bf3835724cfa45e958c5c1846066) # Maps
catkin_download_test_data(${PROJECT_NAME}_willow-full.pgm
http://download.ros.org/data/amcl/willow-full.pgm
DESTINATION ${CATKIN_DEVEL_PREFIX}/${CATKIN_PACKAGE_SHARE_DESTINATION}/test
MD5 b84465cdbbfe3e2fb9eb4579e0bcaf0e)
catkin_download_test_data(${PROJECT_NAME}_willow-full-0.05.pgm
http://download.ros.org/data/amcl/willow-full-0.05.pgm
DESTINATION ${CATKIN_DEVEL_PREFIX}/${CATKIN_PACKAGE_SHARE_DESTINATION}/test
MD5 b61694296e08965096c5e78611fd9765) # Tests
add_rostest(test/set_initial_pose.xml)
add_rostest(test/set_initial_pose_delayed.xml)
add_rostest(test/basic_localization_stage.xml)
add_rostest(test/small_loop_prf.xml)
add_rostest(test/small_loop_crazy_driving_prg.xml)
add_rostest(test/texas_greenroom_loop.xml)
add_rostest(test/rosie_multilaser.xml)
add_rostest(test/texas_willow_hallway_loop.xml) # Not sure when or if this actually passed.
#
# The point of this is that you start with an even probability
# distribution over the whole map and the robot localizes itself after
# some number of iterations of sensing and motion.
#
# add_rostest(test/global_localization_stage.xml)
endif()

3.常用语句及语法

3.1 常用指令

cmake_minimum_required(VERSION xxx) #cmake最小版本需求,新版本的cmake改了很多东西,提升了便利性,也可能让你自己挖坑了
project(xxx) #设置此项目的名称
add_executable(target target_source_codes) #生成可执行文件target ,后面填写的是生成此可执行文件所依赖的源文件列表。
SET(var_name var_value)# 设置一个名字var_name 的变量,同时给此变量赋值为var_value
MESSAGE("MSG") #类比echo 打印消息
option(var_name "comment" var_value) #给变量var_name赋值为var_value,comment是此变量的注释,和SET 有类似的功效,用于给某变量设置默认值
include_directories(xxx) #添加include路径,也就是 gcc -I xxx 的意思,或者vs ide中添加头文件包含目录
add_subdirectory(xxx) #调用xxx子目录的CMakeLists.txt执行
add_compile_options(xxx) #给编译器添加xxx参数,但是貌似没有什么用,我一般不这样添加参数,不直接
link_directories(xxx) #给编译器添加库目录,也就是 gcc -L xxx 的意思,或者vs ide中添加库的包含目录
add_library(lib_name SHARED or STATIC lib_source_code) #和add_executable类似,生成库文件,SHARED代表动态库,STATIC代表静态库, 最后一个参数代表此库的源文件列表,此指令只有三个参数
target_link_libraries(target_name lib_name ...) #给目标添加依赖库,类似与gcc -l lib_name,此指令有两个用处,一个是给可执行target_name 添加库依赖,二是给库target_name 添加库依赖。

3.2 install 指令(主要是生成Makefile中的install target)

install(FILES flie DESTINATION dir_path) #执行make install时,把file拷贝到dir_path
install(PROGRAMS file DESTINATION dir_path) #执行make install时,把file拷贝到dir_path,并给予file可执行权限
INSTALL(TARGETS ylib ylib_s
#RUNTIME DESTINATION xxx
LIBRARY DESTINATION lib
ARCHIVE DESTINATION lib
)# 安装libylib.so到lib目录,安装libylib_s.a到lib目录,RUNTIME 是安装可执行文件到xxx目录

注意:

INSTALL(TARGETS  ylib ylib_s
#RUNTIME DESTINATION xxx
LIBRARY DESTINATION lib
ARCHIVE DESTINATION lib
)
#对于RUNTIME 和 LIBRARY 两种目标,在安装时候,cmake会默认给你移除掉目标文件中的gcc的Wl,rpath的值,导致某些库找不到的错误。
以下变量会影响此坑,更详细的信息去查查别的资料,我这里就不详细说明了。
#set(CMAKE_SKIP_BUILD_RPATH FALSE)
#set(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE)
#set(CMAKE_INSTALL_RPATH "")
#set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
#set(CMAKE_SKIP_INSTALL_RPATH TRUE)
#set(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib") #set(CMAKE_SKIP_RPATH TRUE)
#set(CMAKE_SKIP_INSTALL_RPATH TRUE)

3.3 config指令

configure_file(fileA fileB @ONLY)
#把fileA 复制并重命名为fileB,此时,fileA中的@var@的值会被替换为cmakelists.txt 中var的值。@ONLY是只转换@va@这种变量

3.4 常用的内置变量

CMAKE_INSTALL_PREFIX  #make install 的安装路径
CMAKE_BUILD_TYPE #生成的目标为debug或者release
CMAKE_C_FLAGS #gcc 的编译参数指定,这个非常好用,一般通过set 修改其值
CMAKE_CXX_FLAGS #g++ 和上面CMAKE_C_FLAGS 类似
CMAKE_CURRENT_SOURCE_DIR # 当前CMakeLists.txt所在的目录,主要用来定位某文件
CMAKE_CURRENT_BINARY_DIR # 当前CMakeLists.txt对应的编译时的目录

第三部分参考:

作者:Iflyinsky2013
来源:CSDN
原文:https://blog.csdn.net/u011728480/article/details/81480668

Ros学习——Cmakelists.txt文件解读的更多相关文章

  1. [CMAKE] 详解CMakeLists.txt文件

    [快速查询]https://cmake.org/cmake/help/v2.8.8/cmake.html#section_Commands 1 CMake简介 CMake是跨平台编译工具,比make更 ...

  2. Ros学习——movebase源码解读之amcl

    1.amcl的cmakelists.txt文件 add_executable(amcl  src/amcl_node.cpp) target_link_libraries(amcl amcl_sens ...

  3. Cmake知识----编写CMakeLists.txt文件编译C/C++程序

    1.CMake编译原理 CMake是一种跨平台编译工具,比make更为高级,使用起来要方便得多.CMake主要是编写CMakeLists.txt文件,然后用cmake命令将CMakeLists.txt ...

  4. Cmake知识----编写CMakeLists.txt文件编译C/C++程序(转)

    1.CMake编译原理 CMake是一种跨平台编译工具,比make更为高级,使用起来要方便得多.CMake主要是编写CMakeLists.txt文件,然后用cmake命令将CMakeLists.txt ...

  5. ROS知识(8)----CMakeLists.txt文件编写的理解

    ROS(Indigo)编程必须要理解CMakeList.txt的编写规则,教程地址:catkin/CMakeLists.txt,官网有相关的教程,中文的翻译版本写的很不错,教程地址:ROS中的CMak ...

  6. 简单CMakeLists.txt文件

    #CMakeLists.txt cmake_minimum_required(VERSION 2.8) project(server) #添加包含目录 include_directories(./in ...

  7. cmake 学习-cmakelists.txt

    #设置库的路径,电脑里有qt4以及qt5,使用qt5时 设置qt5的环境变量(路径). set(CMAKE_PREFIX_PATH $ENV{QTDIR}) #设定工程名称 Project(prona ...

  8. Java学习——读写txt文件

    package HHH; import java.io.*; import static java.lang.System.out; public class OpenFile { public st ...

  9. Ros学习——Movebase源码解读

    1.总体框架 goal global planner-------global_costmap<——map server amcl local planner---------local_cos ...

随机推荐

  1. 几个中文排版web 类库

    1. typo.css http://typo.sofi.sh/ 2.  yue.css http://lab.lepture.com/yue.css/ 规范,统一才是开发的王道.

  2. 异常处理—Exception(二)

    在上一篇中"异常处理--Exception(一)"中,跟大家简单介绍了一下Exception,也使大家充分的了解了Exception管理在一个项目中的重要性,那如何在我们的项目中处 ...

  3. idea创建文件类型失败(xml之类的失效

    https://blog.csdn.net/sutongxuevip/article/details/72832754

  4. RK3288 HDMI增加特殊分辨率

    转载请注明出处:https://www.cnblogs.com/lialong1st/p/9174475.html CPU:RK3288 系统:Android 5.1 本帖以 HDMI 800x600 ...

  5. 【转载】最短路径—Dijkstra算法和Floyd算法

    注意:以下代码 只是描述思路,没有测试过!! Dijkstra算法 1.定义概览 Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始 ...

  6. C# WMP 视频播放

    1. C#播放器控件常用的方法介绍 右击工具箱->选择项(I)... -> 显示"选择工具箱项" -> COM组件 -> Windows Media Pla ...

  7. python的mp3play库试用

    没有见过比这个更小型的库了,下面程序实现的功能:播放音乐,按空格键实现暂停和播放的切换. #coding=utf-8 import mp3play import pythoncom, pyHook i ...

  8. Socket客户端

    using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threa ...

  9. Zookeeper--配置服务

    Zookeeper--配置服务 配置服务是分布式应用中重要的服务,作用是使集群中的机器可以共享配置信息中公共的部分.ZooKeeper可作为一个具有高可用,全局一致的配置服务器,允许客户端获取和更新配 ...

  10. python--logging库学习_自我总结---有空完善

    思路: 1.把前面的都封装,然后在测试用例里面调用,每一步测试步骤下面都加一个  logging.info('这个是测试步骤')(可以 亲测) 2.尝试添加到unittest框架里面,看能不能一起使用 ...