在ROS的编程过程中,如果CMakeLists.txt如果写不好,编译就很难成功。如果看不懂CMakeLists.txt那么很多错误你也不知道时什么回事。所以深入了解它是很有必要的。现在我们就来看看它。

我们使用cmake进行程序编译的时候,会根据CMakeLists.txt这个文件进行一步一步的处理,然后形成一个MakeFile文件,系统再通过这个文件的设置进行程序的编译。

我们可以先寻找一些cmake方面的东西进行一定的了解。ROS中的CMakeLists.txt也是基于普通的cmake的。ROS中的CMakeLists.txt主要包括下面几个部分:

  1. Required CMake Version(cmake_minimum_required)

  2. Package Name(project())

  3. Find other CMake/Catkinpackages needed for build (find_package())

  4. Message/Service/ActionGenerators(add_message_files(), add_service_files(), add_action_files())

  5. Invokemessage/service/action generation(generate_messages())

  6. Specify package buildinfo export (catkin_package())

  7. Libraries/Executablesto build(add_library()/add_executable()/target_link_libraries())

  8. Tests to build(catkin_add_gtest())

  9. Install rules(install())

下面就进行一一的解释。

1,

  cmake_minimum_required(VERSION 2.8.3)

catkinCMakeLists.txt都要以此开始,catkin编译需要2.8.3版本以上的cmake。

2,

  project(beginner_tutorials)

通过project()这个函数指定包的名字,在CMake中指定后,你可在其他地方通过使用变量${PROJECT_NAME}来引用它

3,

  find_package

这里指明构建这个package需要依赖的package,我们使用catkin_make的编译方式,至少需要catkin这个包。

  find_package(catkin REQUIRED)

一个包被被find_package,那么就会导致一些CMake变量的产生,这些变量后面将在CMake的脚本中用到,这些变量描述了所依赖的包输出的头文件、源文件、库文件在哪里。这些变量的名字依照的惯例是<PACKAGENAME>_<PROPERTY>,比如:

<NAME>_FOUND:这个变量说明这个库是否被找到,如果找到就被设置为true,否则设为false;

  <NAME>_INCLUDE_DIRS or<NAME>_INCLUDES:这个包输出的头文件目录;

  <NAME>_LIBRARIES or <NAME>_LIBS:这个包输出的库文件。

  需要的所有包我们都可用这种方式包含进来,比如我们还需要roscpp,rospy,std_msgs。我们可以写成:

 find_package(roscpp REQUIRED)
find_package(rospy REQUIRED)
find_package(std_msgs REQUIRED)

这样的话,每个依赖的package都会产生几个变量,这样很不方便。所以还有另外一种方式:

 find_package(catkin REQUIRED COMPONENTS
               roscpp
               rospy
               std_msgs
               message_generation
)

这样,它会把所有pacakge里面的头文件和库文件等等目录加到一组变量上,比如:catkin_INCLUDE_DIRS,这样,我们就可以用这个变量查找需要的文件了。最终就只产生一组变量了。

4,

 Declare ROS messages, services and actions

当我们需要使用.msg .srv .action形式的文件时,我们需要特殊的预处理器把他们转化为系统可以识别特定编程语言(.h   .cpp)。系统会用里面所有的(一些编程语言)生成器(比如
   
gencpp, genpy, genlisp, etc)生成相应的.cpp .py文件。这就需要三个宏:add_message_files,
add_service_files,add_action_files来相应的控制.msg .srv
.action。这些宏后面必须跟着一个调用generate_messages()。他们的运用要注意一下几点:

1)这些宏必须在catkin_package() 宏前面,即:

 find_package(catkin REQUIRED COMPONENTS ...)
add_message_files(...)
add_service_files(...)
add_action_files(...)
generate_messages(...)
catkin_package(...)
...

2)宏 catkin_package()中必须有CATKIN_DEPENDS依赖于message_runtime,即:

 catkin_package(
...
CATKIN_DEPENDS message_runtime ...
...)

3)find_package()必须依赖包message_generation

 find_package(catkin REQUIRED COMPONENTS message_generation)

4)package.xml文件build_depend必须包含 message_generation,run_depend必须包含 message_runtime。

5)如果你有一个包编译.msg .srv,并且可执行文件要使用他们,那么你就需要创建一个显式的依赖项,自动生成message的target。这样才能按顺序来进行编译:

  add_dependencies(some_target ${PROJECT_NAME}_generate_messages_cpp)

这里的some_target是add_executable()设置的target的名字。

5,

catkin_package()

这是一个catkin提供的cmake宏,当我们要给构建系统指定catkin的特定的信息时就需要了,或者反过来利用他产生pkg-config和CMake文件。这个函数必须在声明add_library()或者 add_executable()生成target之前使用。

6,指定编译的target

编译产生的target有多种形式,通常有两种:程序可以运行的可执行文件以及在可执行文件编译和运行时要用到的库。

1)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。

2)设置输出路径:

ROS中的输出路径时默认的,但是也可通过下面进行修改:

 set_target_properties(python_module_library
PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${CATKIN_DEVEL_PREFIX}/${CATKIN_PACKAGE_PYTHON_DESTINATION})

3)头文件路径和库文件路径:

  在我们指定target之前,我们需要指明对target而言,在哪里找源文件,特别是在哪里找头文件,在哪里找库文件。

  Include Paths:指明编译代码时在哪里寻找头文件;

  Library Paths:指明可执行文件需要的库文件在哪里。

  函数:

  include_directories:他的参数是通过find_package产生的*_INCLUDE_DIRS变量和其他所有额外的头文件路径。例如:

include_directories(include ${Boost_INCLUDE_DIRS} ${catkin_INCLUDE_DIRS})

  这里"include"表示你的pacakge里面的include这个路径也包含在里面。

  link_directories():这个函数用来添加额外的库的路径,然而,这并不鼓励使用,因为所有的catkin和cmake的package在使用find_package时就已经自动的有他们的链接信息。简单的连接可以通过target_link_libraries()来进行。

4)可执行target:

  例如:

add_executable(myProgram src/main.cpp src/some_file.cpp src/another_file.cpp)

5)库target:

add_library()用来指定编译产生的库。默认的catkin编译产生共享库:

add_library(${PROJECT_NAME} ${${PROJECT_NAME}_SRCS})

6)链接库:

使用target_link_libraries函数来指定可执行文件链接的库。这个要用在add_executable()后面。形如:

target_link_libraries(<executableTargetName>, <lib1>, <lib2>, ... <libN>)

比如:

add_executable(foo src/foo.cpp)
add_library(moo src/moo.cpp)
target_link_libraries(foo moo)

这就是将可执行文件foo链接到库文件libmoo.so。

ROS中的CMakeLists.txt的更多相关文章

  1. ROS中的CMakeLists.txt (转)

    在ROS的编程过程中,如果CMakeLists.txt如果写不好,编译就很难成功.如果看不懂CMakeLists.txt那么很多错误你也不知道时什么回事.所以深入了解它是很右必要的.现在我们就来看看它 ...

  2. 在ros功能包CMakeLists.txt中获取所在功能包的路径 便于添加第三方库的相对路径

    在 ros 功能包中要使用第三方的动态库,将其放在系统默认库路径和使用绝对路径均不可取,这样的话可移植性较差,将该功能包移到其它电脑时要重新配置依赖库的路径,太麻烦了. 于是找到下面这个方法,解决了R ...

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

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

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

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

  5. 如何在ROS中使用PCL—数据格式(1)

    在ROS中点云的数据类型 在ROS中表示点云的数据结构有: sensor_msgs::PointCloud      sensor_msgs::PointCloud2     pcl::PointCl ...

  6. 在ROS中使用OpenCV

    1.在工作空间下创建程序包 $ cd ~/catkin_ws/src$ catkin_create_pkg robot_vision roscpp std_msgs cv_bridge image_t ...

  7. CMakeLists.txt install

    本部分是关于ros CMakeLists.txt install  :可参考http://wiki.ros.org/catkin/CMakeLists.txt 1.CMakeLists.txt中的in ...

  8. CMakeLists.txt编写常用命令

    目录 1. 设置cmake最小版本 2. 设置项目名称 3. 设置编译目标类型 4. 指定编译包含的源文件 1. 明确指明包含的源文件 2. 搜索指定目录的所有的cpp文件 3. 自定义搜索规则 4. ...

  9. Linux c++ vim环境搭建系列(6)——CMakeLists.txt多文档多目录组织方法和编写示例

    CMakeLists.txt学习 1. 概要 主要是关于cmakelists.txt的编写模板,和多文档多目录的组织方法详解, 涉及第三方库的添加使用方法. 这里主要介绍cmakelists.txt的 ...

随机推荐

  1. bzoj 2120 数颜色 (带修莫队)

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=2120 题意:两种操作:Q 询问区间  l - r  内颜色的种类 ,R 单点修改 思路 ...

  2. day21 正则表达式

    正则表达式 简单的范围的字符组 0-9 匹配所有的数字 a-z 匹配所有的小写字母 A-Z 匹配所有的大写字母 A-Za-z 匹配所有的字母 字符 . 换行符以外的任意字符 \w word 匹配数字, ...

  3. Leetcode 461.汉明距离 By Python

    两个整数之间的汉明距离指的是这两个数字对应二进制位不同的位置的数目. 给出两个整数 x 和 y,计算它们之间的汉明距离. 注意: 0 ≤ x, y < 231. 示例: 输入: x = 1, y ...

  4. 洛谷 P4151 [WC2011]最大XOR和路径 解题报告

    P4151 [WC2011]最大XOR和路径 题意 求无向带权图的最大异或路径 范围 思路还是很厉害的,上午想了好一会儿都不知道怎么做 先随便求出一颗生成树,然后每条返祖边都可以出现一个环,从的路径上 ...

  5. git 28原则

    一.流程 $ git init # 创建一个新的仓库 sublime 编写文本,不要使用win自带文本编辑器 $ git add file1 # 将文件添加到暂存区 $ git add file2 $ ...

  6. FFMEPG -- A ffmpeg and SDL Tutorial : tutorial05

    修改了同步播放ffmpeg问题.并且增加可以放大视频. // tutorial05.c // A pedagogical video player that really works! // // C ...

  7. 1093. Count PAT's

    The string APPAPT contains two PAT's as substrings. The first one is formed by the 2nd, the 4th, and ...

  8. Flash10下复制到剪切板的一种新方法

    web开发中常常要实现“复制到剪切板”功能.这个功能很实用,但是由于安全问题,浏览器的限制越来越严,实现的方法也越来越有限了.Firefox默认下不能直接通过Javascript操作剪切板,必须开启相 ...

  9. SpaceNet 数据集

    SpaceNet 数据集 SpaceNet是DigitalGlobe商业卫星公司提供的遥感图像集合,包含一些标记信息可用作机器学习研究. SpaceNet Challenge主页: https://s ...

  10. 预测氨基酸替换的致病性及分子机制:MutPred工具的使用

    MutPred的功能是预测氨基酸替换后的致病性及其分子机制,旧版本见链接:http://mutpred1.mutdb.org/ 新版本更新为MutPred2,见网站链接:http://mutpred2 ...