catkin_make 浅析

引用自http://blog.csdn.net/zyh821351004/article/details/50388429

update:   catkin_tools

---------------------------------

Catkin Command Line Tools:

Installing catkin_tools:   sudo apt-get install python-catkin-tools

CLI Comparison:catkin_make /catkin_make_isolated

---------------------------------

1.  catkin_make 与cmake的关系

程序在cmake编译是这样的流程, cmake指令依据你的CMakeLists.txt 文件,生成makefiles文件,make再依据此makefiles文件编译链接生成可执行文件.

catkin_make是将cmake与make的编译方式做了一个封装的指令工具, 规范了工作路径与生成文件路径.

1)  cmake标准流程

[cpp] view plain copy

  1. # 在一个CMake项目里
  2. $ mkdir build
  3. $ cd build
  4. $ cmake ..
  5. $ make
  6. $ make install  # (可选)

2) catkin_make 的流程

[cpp] view plain copy

  1. # In a catkin workspace
  2. $ catkin_make
  3. $ catkin_make install  # (可选)
  4. 如果源码不在默认工作空间,需要指定编译路径:
  5. # In a catkin workspace
  6. $ catkin_make --source my_src
  7. $ catkin_make install --source my_src  # (optionally)

2 catkin_make

CMake coding standards

CMake Variables

1) catkin_make默认的路径信息

[cpp] view plain copy

  1. 在catkin_make运行后终端输出文件部分解析
  2. #基本路径
  3. Base path: /home/user/catkin_ws
  4. Source space: /home/user/catkin_ws/src
  5. Build space: /home/user/catkin_ws/build
  6. Devel space: /home/user/catkin_ws/devel
  7. Install space: /home/user/catkin_ws/install
  8. #catkin_make 封装运行中cmake运行的情况
  9. Running command: "cmake /home/user/catkin_ws/src -DCATKIN_DEVEL_PREFIX=/home/user/catkin_ws/devel
  10. -DCMAKE_INSTALL_PREFIX=/home/user/catkin_ws/install" in "/home/user/catkin_ws/build"
  11. #编译工具查找
  12. -- Using CATKIN_DEVEL_PREFIX: /tmp/catkin_ws/devel
  13. -- Using CMAKE_PREFIX_PATH: /opt/ros/groovy
  14. -- This workspace overlays: /opt/ros/groovy
  15. #编译的包
  16. <pre name="code" class="cpp">#catkin_make 封装运行中make运行的情况

#### Running command: "make -j4" in "/home/user/catkin_ws/build"


2)  layout :ros工作空间文件系统结构

[cpp] view plain copy

  1. workspace_folder/        --WORKSPACE
  2. src/                   --SOURCE SPACE
  3. CMakeLists.txt/      --This is symlinked to catkin/cmake/toplevel.cmake
  4. package_1/
  5. CMakeLists.txt
  6. package.xml
  7. ...
  8. package_n/
  9. CMakeLists.txt
  10. package.xml
  11. build/                 --BUILD SPACE(this is where build system is invoked, not necessarily within workspace)
  12. CATKIN_IGNORE        --Marking the folder to be ignored when crawling for packages (necessary when source
  13. space is in the root of the workspace, the file is emtpy)
  14. #此选项可用于忽略某个包编译
  15. devel/                 --DEVEL SPACE (targets go here, parameterizable, but defaults to peer of Build Space)
  16. # 生成二值 库 可执行文件
  17. bin/
  18. etc/
  19. /include/
  20. lib/
  21. share/
  22. .catkin              --Marking the folder as a development space (the file contains a semicolon separated list of Source space paths)
  23. #
  24. env.bash
  25. setup.bash
  26. setup.sh
  27. ...
  28. install/               --INSTALL SPACE (this is where installed targets for test installations go, not necessarily within workspace)
  29. bin/
  30. etc/
  31. include/
  32. lib/
  33. share/
  34. .catkin              --Marking the folder as an install space (the file is emtpy)
  35. env.bash
  36. setup.bash    -- Environment setup file for Bash shell
  37. setup.sh      -- Environment setup file for Bourne shell
  38. ...
  39. /
  40. opt/
  41. ros/
  42. groovy/
  43. setup.bash -- Environment setup file for Bash shell
  44. setup.sh   -- Environment setup file for Bourne shell
  45. setup.zsh  -- Environment setup file for zshell
  46. ...

工作空间

源空间

编译空间

开发空间

安装空间  -DCMAKE_INSTALL_PREFIX=/any/directorycmake默认是/usr/local

系统安装空间         /opt/ros/ROSDISTRO

结果空间            source RESULT-SPACE/setup.sh             类似扫描安装空间与开发空间,替换系统通用下的对应文件.

3)Overlays

catkin支持覆盖.

catkin支持包的逐层覆盖, 当前最高,其它依据source的顺序逐层变高, 高层可覆盖低层.

[cpp] view plain copy

  1. Example 4: Overlaying workspace 3 on top of local workspace2 install space on top of workspace1 devel space on top of system install
  2. cd ~/workspace2/build
  3. cmake -DCMAKE_INSTALL_PREFIX=~/ws2_installed ../src
  4. make
  5. make install
  6. source ~/ws2_installed/setup.bash
  7. cd ~/workspace3/build
  8. cmake ../src
  9. make

ros 环境变量设置 可以参考.bashrc文件: ros工作环境设置

[cpp] view plain copy

  1. ######  slam_ws
  2. source /opt/ros/indigo/setup.bash
  3. source /home/yhzhao/slam_ws/devel/setup.bash
  4. export ROS_PACKAGE_PATH=~/slam_ws/src:$ROS_PACKAGE_PATH
  5. export ROS_WORKSPACE=~/slam_ws/src

4) 混合 Mixing catkin And rosbuild Workspaces

catkin was designed to allow rosbuild packages to sit on top of catkin ones. This is accomplished by using overlays.

[cpp] view plain copy

  1. ~/rosbuild_ws/
  2. dry_pkg1/
  3. ...
  4. dry_pkgN/
  5. setup.bash
  6. setup.sh
  7. ~/catkin_ws/
  8. src/
  9. wet_pkg1/
  10. ...
  11. wet_pkgN/
  12. build/
  13. devel/
  14. setup.bash
  15. setup.sh
  16. install/
  17. setup.bash
  18. setup.sh

注:  我们在系统文件夹下的 .bashrc 中加入相应的source文件,  就是为了添加ros 的环境变量等信息.

Differences in CMakeLists.txt for rosbuild and catkin

5)  catkin_make 编译指定的包.

$ catkin_make -DCATKIN_WHITELIST_PACKAGES="package1;package2"

恢复编译所有的包

$ catkin_make -DCATKIN_WHITELIST_PACKAGES=""

3  catkin

catkin/Tutorials

4.  package. xml  与  CMakeList. txt

4.1 package. xml

catkin API docs.

每个包的描述文件,都需要放置在包的根目录下,对包的名字/版本/作者/维护者/依赖关系进行说明.与rosbuild中的manifest.xml相似.

依赖不正确在本地可以可以编译通过,但不能在ROS社区正确工作起来.

4.1.1  格式

[cpp] view plain copy

  1. <package>
  2. <name>foo_core</name>
  3. <version>1.2.4</version>
  4. <description>
  5. This package provides foo capability.
  6. </description>
  7. <maintainer email="[email protected]">Ivana Bildbotz</maintainer>
  8. <license>BSD</license>
  9. <url>http://ros.org/wiki/foo_core</url>
  10. <author>Ivana Bildbotz</author>
  11. <buildtool_depend>catkin</buildtool_depend>
  12. <depend>roscpp</depend>
  13. <depend>std_msgs</depend>
  14. <build_depend>message_generation</build_depend>
  15. <exec_depend>message_runtime</exec_depend>
  16. <exec_depend>rospy</exec_depend>
  17. <test_depend>python-mock</test_depend>
  18. <doc_depend>doxygen</doc_depend>
  19. </package>

C++ catkin library dependencies

6种依赖标签

Build Dependencies     指出你的包编译需要依赖的包.

Build Export Dependencies      指出你的包编译导出库 (???):   b依赖a的头文件,要想c只依赖b.   我认为是避免多次依赖.

specify which packages are needed to build libraries against this package. This is the case when you transitively include their headers in public headers in this package (especially when these packages are declared as (CATKIN_)DEPENDS in catkin_package() in CMake).

Execution Dependencies   执行时依赖

Test Dependencies         单元测试

Build Tool Dependencies     编译系统工具

Documentation Tool Dependencies      doc生成工具

[cpp] view plain copy

  1. <depend> specifies that a dependency is a build, export, and execution dependency. This is the most commonly used dependency tag.
  2. <buildtool_depend>
  3. <build_depend>
  4. <build_export_depend>
  5. <exec_depend>
  6. <test_depend>
  7. <doc_depend>http://write.blog.csdn.net/postedit/50388429
4.1.2 Metapackages   将多个包组合成一个逻辑包

[cpp] view plain copy

  1. <export>
  2. <metapackage />
  3. </export>

仅需要标签:   <buildtool_depends> 依赖 catkin   和  <run_depend>

对应cmakelists.txt中

[cpp] view plain copy

  1. cmake_minimum_required(VERSION 2.8.3)
  2. project(<PACKAGE_NAME>)
  3. find_package(catkin REQUIRED)
  4. catkin_metapackage()

========例如 universal_robot======================================

[cpp] view plain copy

  1. <package>
  2. <name>universal_robot</name>
  3. <version>1.1.5</version>
  4. <description>
  5. Drivers, description, and utilities for Universal Robot Arms.
  6. </description>
  7. <maintainer email="[email protected]">Alexander Bubeck</maintainer>
  8. <license>BSD</license>
  9. <url type="website">http://ros.org/wiki/universal_robot</url>
  10. <author email="[email protected]">Shaun Edwards</author>
  11. <author>Stuart Glaser</author>
  12. <author email="[email protected]">Kelsey Hawkins</author>
  13. <author>Wim Meeussen</author>
  14. <author email="[email protected]">Felix Messmer</author>
  15. <buildtool_depend>catkin</buildtool_depend>
  16. <run_depend>ur3_moveit_config</run_depend>
  17. <run_depend>ur5_moveit_config</run_depend>
  18. <run_depend>ur10_moveit_config</run_depend>
  19. <run_depend>ur_bringup</run_depend>
  20. <run_depend>ur_description</run_depend>
  21. <run_depend>ur_driver</run_depend>
  22. <run_depend>ur_gazebo</run_depend>
  23. <run_depend>ur_kinematics</run_depend>
  24. <run_depend>ur_msgs</run_depend>
  25. <export>
  26. <metapackage/>
  27. </export>
  28. </package>

[cpp] view plain copy

  1. cmake_minimum_required(VERSION 2.8.3)
  2. project(universal_robot)
  3. find_package(catkin REQUIRED)
  4. catkin_metapackage()

4.2  CMakeLists.txt

cmak 不会找package.xml文件, 但catkin需要.  依据cmakelists.txt文件编译需要清晰指出头文件和库文件的指向.

Finding the library

需要在package.xml中使用标签<depend> 或者<build_depend>

find_package(catkin REQUIRED COMPONENTS roscpp)

Include directories

include_directories(include ${catkin_INCLUDE_DIRS})

Exporting interfaces

需要在package.xml中使用<depend> 或者<build_export_depend>,catkin_package() 命令仅调用一次,它需要额外的参数依赖

于你的包导出的依赖.

catkin_package(CATKIN_DEPENDS angles roscpp std_msgs)

4.3  C++ 系统库依赖

Finding the library

1) 依据CMake module . 大部分的boost 库在头文件完全实现,运行时不需要独立的分享连接.
find_package(Boost REQUIRED)

但boost thread 运行时需要库,必须指出组件thread .

find_package(Boost REQUIRED COMPONENTS thread)

find_package()之后就可以用此编译和连接了.  命名规则基本是这样: ${name}_INCLUDE_DIRS and${name}_LIBRARIES .有时不遵循

camke社区标准命名的就请到到answers.ros.org发问.

2) cmake modules 无效情况下,但库开发包提供了pkg-config module . 编译标签
find_package(PkgConfig REQUIRED)
pkg_check_modules(GSTREAMER REQUIRED libgstreamer-0.10)

pkg_check_modules() 参数声明了一个cmake前缀,GSTREAMER_INCLUDE_DIRS 和GSTREAMER_LIBRARIES

PkgConfig  编译应用与连接的帮助工具. 用于命令行中插入正确的编译选项. (.pc文件 )  libgstreamer-0.10.pc.

Include directories

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

如有依赖catkin 包 ,再添加 ${catkin_INCLUDE_DIRS}

Exporting interfaces

catkin_package(DEPENDS Boost GSTREAMER)

确保所有的包在package.xml被用到,  <build_export_depend> 和<depend>标签.

 

标准命名 ${name}_INCLUDE_DIRS and${name}_LIBRARIES . catkin包一般是小写,大写(asGSTREAMER) 或混合 (likeBoost)

4.4 编译安装 C++ libraries and headers

include_directories(include
                    ${catkin_INCLUDE_DIRS}
                    ${Boost_INCLUDE_DIRS}
                    ${GSTREAMER_INCLUDE_DIRS})
add_library(your_library libsrc1.cpp libsrc2.cpp libsrc_etc.cpp)
set(YOUR_LIB_SOURCES
    libsrc1.cpp
    libsrc2.cpp
    libsrc3.cpp
    libsrc4.cpp
    libsrc_etc.cpp)
add_library(your_library ${YOUR_LIB_SOURCES})
target_link_libraries(your_library ${catkin_LIBRARIES})
target_link_libraries(your_library
                      ${catkin_LIBRARIES}
                      ${Boost_LIBRARIES}
                      ${GSTREAMER_LIBRARIES})
catkin_package(CATKIN_DEPENDS std_msgs
               DEPENDS Boost
               INCLUDE_DIRS include
               LIBRARIES your_library)
<depend>std_msgs</depend>
<build_export_depend>boost</build_export_depend>

安装

install(TARGETS your_library your_other_library
        ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
        LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
        RUNTIME DESTINATION ${CATKIN_GLOBAL_BIN_DESTINATION})
install(DIRECTORY include/${PROJECT_NAME}/
        DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION})
install(DIRECTORY include/${PROJECT_NAME}/
        DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION}
        PATTERN ".svn" EXCLUDE)

4.5 编译安装 C++ 执行文件

include_directories(include
                    ${catkin_INCLUDE_DIRS}
                    ${Boost_INCLUDE_DIRS}
                    ${GSTREAMER_INCLUDE_DIRS})
add_executable(your_node src1.cpp src2.cpp src_etc.cpp)
set(${PROJECT_NAME}_SOURCES
    src/file1.cpp
    src/file2.cpp
    src/file3.cpp
    src/file4.cpp
    src/file5.cpp
    src/file6.cpp
    src/file_etc.cpp)
add_executable(your_node ${${PROJECT_NAME}_SOURCES})
add_executable(your_node ${${PROJECT_NAME}_SOURCES})
target_link_libraries(your_node ${catkin_LIBRARIES})
add_executable(your_node ${${PROJECT_NAME}_SOURCES})
target_link_libraries(your_node
                      ${catkin_LIBRARIES}
                      ${Boost_LIBRARIES}
                      ${GSTREAMER_LIBRARIES})

ros下的安装,使得rosrun 与roslaunch能够使用.需要下面的方式安装.

install(TARGETS your_node
        RUNTIME DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION})

安装 cmake文件

catkin_package(CFG_EXTRAS your_macros.cmake your_modules.cmake)
install(FILES cmake/your_macros.cmake cmake/your_modules.cmake
        DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}/cmake)
install(DIRECTORY cmake
        DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}
        PATTERN ".svn" EXCLUDE)

4.6  CMake coding standards

4.7   CMake Variables

CMake Useful Variables

参考:

http://wiki.ros.org/catkin

http://wiki.ros.org/catkin/commands/catkin_make

http://wiki.ros.org/cn/ROS/Tutorials/catkin/BuildingPackages

CMake coding standards

CMake Variables

CMake Useful Variables

时间: 2024-10-12 03:20:02

catkin_make 浅析的相关文章

Python之encode与decode浅析

 Python之encode与decode浅析 在 python 源代码文件中,如果你有用到非ASCII字符,则需要在文件头部进行字符编码的声明,声明如下: # code: UTF-8 因为python 只检查 #.coding 和编码字符串,为了美观等原因可以如下写法: #-*-coding:utf-8-*- 常见编码介绍: GB2312编码:适用于汉字处理.汉字通信等系统之间的信息交换. GBK编码:是汉字编码标准之一,是在 GB2312-80 标准基础上的内码扩展规范,使用了双字节编码.

浅析PHP的开源产品二次开发的基本要求

浅析PHP的开源产品二次开发的基本要求 第一, 基本要求:HTML(必须要非常熟悉),PHP(能看懂代码,能写一些小系统,如:留言板,小型CMS),Mysql(至少会一种数据库),Javascript(能看懂,能改现成的一些代码),Div+Css(能进行界面的调整,明白CSS是怎么使用的) 第二, 熟悉开源产品的使用,比如 Dedecms,你要知道怎么登录,怎么新建栏目,怎么添加文章,模板标签的使用方法,模型的概念和使用方法等等一些功能 第三, 要熟悉这个开源产品的数据库结构,还要理解里面核心文

word-break|overflow-wrap|word-wrap——CSS英文断句浅析

---恢复内容开始--- word-break|overflow-wrap|word-wrap--CSS英文断句浅析 一 问题引入 今天在再次学习 overflow 属性的时候,查看效果时,看到如下结果,内容在 div 中国换行了,可是两个 P 元素的内容并没有换行,搜索一番没有找到系统的答案,截图到群里请教大神,才知道是英文断句的问题,但是还是不太明白.之前没有遇到这种情况,为了彻底搞清楚,英文断句,又开始学习英文断句到底是怎么回事. 二 换行 每种语言里都有换行,就中文而言,我们最小语言单位

浅析vanish

浅析 VANISH --一种cache 第一部分:理解vanish的准备工作 1.对CDN的小剖析 CDN  content  delivery  network  内容分发(推送)网络,是在现有的Internet中增加一层新的网络架构,将网络内容发布到最接近用户的网络边缘(边缘服务器),使用户最近取得所需内容,解决网络拥挤状态,提高用户访问网站的速度. CDN网络架构主要有两部分组成,中心和边缘两部分,中心指CDN网管中心和DNS重定向解析中心,负责全局负载均衡.边缘主要指异地节点,CDN分发

健康,home? [java的内存浅析]

健康,home? [java的内存浅析] 摘要: 原创出处: http://www.cnblogs.com/Alandre/ 泥沙砖瓦浆木匠 希望转载,保留摘要,谢谢! 乐观上上,how can other kno u,u r yourself!I must be strong and carry on. -泥沙砖瓦浆木匠 一.闲谈下 201407月记着那时候身体垮了下来,呵呵.想说,对自己的说,也是对大家的负责吧.那时候胸疼胸闷,然后几乎累垮了,我还坚持了一星期,那一星期真的迷迷糊糊.完全不能

Mysql查询优化器浅析

--Mysql查询优化器浅析 -----------------------------2014/06/11 1 定义 Mysql查询优化器的工作是为查询语句选择合适的执行路径.查询优化器的代码一般是经常变动的,这和存储引擎不太一样.因此,需要理解最新版本的查询优化器是如何组织的,请参考相应的源代码.整体而言,优化器有很多相同性,对mysql一个版本的优化器做到整体掌握,理解起mysql新版本以及其他数据库的优化器都是类似的. 优化器会对查询语句进行转化,转化等价的查询语句.举个例子,优化器会将

Volley框架源码浅析(一)

尊重原创http://blog.csdn.net/yuanzeyao/article/details/25837897 从今天开始,我打算为大家呈现关于Volley框架的源码分析的文章,Volley框架是Google在2013年发布的,主要用于实现频繁而且粒度比较细小的Http请求,在此之前Android中进行Http请求通常是使用HttpUrlConnection和HttpClient进行,但是使用起来非常麻烦,而且效率比较地下,我想谷歌正式基于此种原因发布了Volley框架,其实出了Voll

C语言中文件打开模式(r/w/a/r+/w+/a+/rb/wb/ab/rb+/wb+/ab+)浅析

C语言文件打开模式浅析 在C语言的文件操作语法中,打开文件文件有以下12种模式,如下图: 打开模式  只可以读   只可以写  读写兼备 文本模式 r w a r+ w+ a+ 二进制模式 rb wb ab  rb+ (r+b)   wb+ (w+b)   ab+ (a+b)  其中,二进制模式与文本模式操作相似,只不过是以二进制流的形式读写而已,下面以文本模式为例分析: 1."r" 模式: 1.1 打开文件进行“只读”操作,即只能从文件读取内容. 1.2 若欲操作的文件不存在,则打开

浅析STM32之usbh_def.H

[温故而知新]类似文章浅析USB HID ReportDesc (HID报告描述符) 现在将en.stm32cubef1\STM32Cube_FW_F1_V1.4.0\Middlewares\ST\STM32_USB_Host_Library\Core\Inc\usbh_def.H /** ****************************************************************************** * @file usbh_def.h * @aut