ros下src中的CMakeLists.txt解析

2023-10-29

# toplevel CMakeLists.txt for a catkin workspace 
# catkin/cmake/toplevel.cmake//src下的CMakeLists.txt是由toplevel生成的  cmake_minimum_required(VERSION 2.8.3)
//找到合适的cmake编译工具  set(CATKIN_TOPLEVEL TRUE)  
# search for catkin within the workspace set(_cmd "catkin_find_pkg" "catkin" "${CMAKE_SOURCE_DIR}") execute_process(COMMAND ${_cmd}   RESULT_VARIABLE _res   OUTPUT_VARIABLE _out   
ERROR_VARIABLE _err   
OUTPUT_STRIP_TRAILING_WHITESPACE   ERROR_STRIP_TRAILING_WHITESPACE ) 
if(NOT _res EQUAL 0 AND NOT _res EQUAL 2)   
# searching fot catkin resulted in an error   
string(REPLACE ";" " " _cmd_str "${_cmd}")   message(FATAL_ERROR "Search for 'catkin' in workspace failed (${_cmd_str}): ${_err}") 
endif()  
# include catkin from workspace or via find_package() 
if(_res EQUAL 0)  
 set(catkin_EXTRAS_DIR "${CMAKE_SOURCE_DIR}/${_out}/cmake")  
  
  # include all.cmake without add_subdirectory to let it operate in same scope   
  include(${catkin_EXTRAS_DIR}/all.cmake NO_POLICY_SCOPE)   add_subdirectory("${_out}")  else()   
  
  # use either CMAKE_PREFIX_PATH explicitly passed to 
  CMake as a command line argument  
  
   # or CMAKE_PREFIX_PATH from the environment  
    if(NOT DEFINED CMAKE_PREFIX_PATH)    
   if(NOT "$ENV{CMAKE_PREFIX_PATH}" STREQUAL "")       string(REPLACE ":" ";" 
  CMAKE_PREFIX_PATH $ENV{CMAKE_PREFIX_PATH})   
    endif()  
   endif()  
    # list of catkin workspaces   
  set(catkin_search_path "") 
    foreach(path ${CMAKE_PREFIX_PATH})    
   if(EXISTS "${path}/.catkin")      
   list(FIND catkin_search_path
    ${path} _index)      
   if(_index EQUAL -1)       
     list(APPEND catkin_search_path ${path})       
  endif()    
   endif()  
   endforeach()   
   # search for catkin in all workspaces  
   set(CATKIN_TOPLEVEL_FIND_PACKAGE TRUE)   find_package(catkin QUIET   
    NO_POLICY_SCOPE    
   PATHS ${catkin_search_path}    
   NO_DEFAULT_PATH NO_CMAKE_FIND_ROOT_PATH)   unset(CATKIN_TOPLEVEL_FIND_PACKAGE)    
  if(NOT catkin_FOUND)     
  message(FATAL_ERROR "find_package(catkin) failed. catkin was neither found in the workspace nor in the CMAKE_PREFIX_PATH. One reason may be that no ROS setup.sh was sourced before.")  
   endif() 
   endif()  
  catkin_workspace()

这个文件的大部分内容都是在找catkin这个包的位置。最后执行一个cmake函数catkin_workspace。这个函数在/opt/ros/kinetic/share/catkin/cmake/catkin_workspace.cmake文件中定义。这个函数对catkin_make执行时的参数进行解析,比如CATKIN_WHITELIST_PACKAGES。然后开始遍历工作空间中的文件夹,如果文件夹中有package.xml文件就将其当作一个软件包。同时对每个软件包调用add_subdirectory。add_subdirectory是一个cmake的内置函数,会调用这个文件夹内的CMakeList.txt文件。这样就开始了每个软件包的编译了。

 cmake_minimum_required(VERSION 2.8.3) project(tf2_geometry_msgs)  find_package(orocos_kdl) find_package(catkin REQUIRED COMPONENTS geometry_msgs tf2_ros tf2) find_package(Boost COMPONENTS thread REQUIRED) 
  # Issue #53 
  find_library
  (KDL_LIBRARY REQUIRED 
  NAMES orocos-kdl HINTS 
  ${orocos_kdl_LIBRARY_DIRS}
  )  
  catkin_package( 
     LIBRARIES ${KDL_LIBRARY}   
      INCLUDE_DIRS include 
         DEPENDS orocos_kdl  
           CATKIN_DEPENDS  geometry_msgs tf2_ros tf2)  include_directories(include                     
  ${catkin_INCLUDE_DIRS} )  link_directories(${orocos_kdl_LIBRARY_DIRS})    install(DIRECTORY include/${PROJECT_NAME}/   DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION} ) catkin_python_setup()  
  if(CATKIN_ENABLE_TESTING)  find_package(catkin REQUIRED COMPONENTS geometry_msgs rostest tf2_ros tf2)  
  add_executable(test_geometry_msgs EXCLUDE_FROM_ALL test/test_tf2_geometry_msgs.cpp) target_link_libraries(test_geometry_msgs 
  ${catkin_LIBRARIES}
   ${GTEST_LIBRARIES}
    ${orocos_kdl_LIBRARIES}) 
  add_rostest(${CMAKE_CURRENT_SOURCE_DIR}/test/test.launch)
   add_rostest(${CMAKE_CURRENT_SOURCE_DIR}/test/test_python.launch) 
    if(TARGET tests) 
      add_dependencies(tests test_geometry_msgs) 
  endif()
    endif()

首先是指明cmake版本,项目名称,软件包依赖之类的常见操作。然后执行了catkin_package这个函数。这个函数做了大量的工作。catkin_package在/opt/ros/kinetic/share/catkin/cmake/catkin_package.cmake文件中定义。devel和build文件夹内的内容基本都是由其生成的。
这个函数解析package.xml文件,提取出里面的参数,由这些参数给find_package和pkg-config生成对应的配置文件。这样其他的对这个软件包有依赖的程序就可以方便的使用了。

所以需要重点分析的就是catkin_package这个函数。
对于编译程序最重要的就是头文件的位置和链接库的位置。也就是include directory 和 library directory。这个函数就是在为软件包配置这些参数。它自动的根据依赖关系把依赖的程序的头文件和链接库目录加入到当前的变量中。然后根据这些参数和对应的模板文件生成对应的配置文件。比如根据/opt/ros/kinetic/share/catkin/cmake/templates/pkgConfig.cmake.in生成软件包的pkgConfig.cmake文件。这样这个软件包就可以被其他的软件包用find_package找到。

如果在编译过程中发现有软件包的路径出了问题,那么就要在这个过程去debug。很有可能是生产pkgConfig.cmake时的参数不对。最终可能是依赖包中的软件包路径问题(有挺多的ros软件包都是把路径写死的,这样很不好)。

由catkin_package生成的文件最终会被安装到devel和build文件夹下。下面就具体看一下生成了哪些文件。
下面是一个一般的devel的文件结构。devel是develop的缩写,所以这就是开发环境。

bin内是被编译的可执行文件。lib是pkg.pc文件和python的库文件。pkg.pc是pkg-config的配置文件(关于pkg-config可以看另外一篇帖子)。 include用来放置头文件。 share是放置生成的pkgConfig.cmake文件的,在cmake文件中find_package就会用到这些文件。下面是其中的一个例子。

对于build文件夹,生成是一些编译中的中间文件,比如用来存储一些环境变量之类的文件。这个文件夹意义不大。
如果你在编译过程中出现问题可以去看build文件夹中各种文件内部的参数,可以方便的定位到可能出现问题的位置。

总结一下整个编译的过程

执行catkin_make
执行catkin_workspace。解析catkin_make的参数同时遍历整个工作空间把所有的有package.xml的文件夹添加进软件包列表里面。对每个软件包执行add_subdirectory
执行每个软件包内部的CMakeList.txt文件。
执行 catkin_package。解析package.xml文件,载入对应的参数。根据依赖参数,载入对应的软件包参数。根据载入参数生成当前软件包的配置文件。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ros下src中的CMakeLists.txt解析 的相关文章

  • MongoDB 使用总结

    简介 java系列技术分享 持续更新中 初衷 一起学习 一起进步 坚持不懈 如果文章内容有误与您的想法不一致 欢迎大家在评论区指正 希望这篇文章对你有所帮助 欢迎点赞 收藏 留言 更多文章请点击 文章目录 一 MongoDB简介 二 Mon
  • 臻识科技用全智能相机,把智慧城市的交通/安防/工业制造做到极致

    俨然 智慧城市已经是一个技术密集 资本密集 巨头密集 关注度密集的大热门领域 从技术层面来看 智慧城市对当下热门技术进行了综合 Cloud Big Data AI AR VR 5G IoT Quantum Computing Edge Co
  • 极域课堂管理系统软件V6.0 2016 豪华版

    百度网盘链接地址 https pan baidu com s 1ZXClL84 iFl8klR3Kme5 w 地址链接失效请及时联系本人 QQ 395648542
  • 超实用!深度比较Python对象之间的差异

    本文完整示例代码及文件已上传至Github仓库https github com CNFeffery PythonPracticalSkills 很多情况下我们需要对两条数据之间的差异进行比较 如果仅仅是针对数值型对象 那么两者的差值就是所谓
  • 面试经:一线城市搬砖,又面软件测试岗,5000就知足了...

    今天有个大专生来我公司面试软件测试 他说在 地下城 64开搬砖 一个月能赚7万多 就在上星期 所有的号全被封了 所以来公司上班了 目前有一年多软件测试工作经验 来面试的这个大专生他的自我介绍是这样的 他说 学历大专 大专学的专业是软件技术
  • 《数学建模实战攻略》

    专栏策划 一 目标受众 数学建模实战攻略 面向数学建模初学者 参加数学建模竞赛的学生以及对数学建模有兴趣的研究者和开发者 二 专栏目录 引言 专栏简介与目标 数学建模的重要性及应用领域 数学建模基本概念与方法论 问题抽象与建模过程 常见数学
  • Linux中断原理、上半部和下半部、硬中断和软中断

    目录 1 中断简介 1 1 作用 1 2 物理实现 1 3 中断请求线IRQ 1 4 异常 2 中断处理程序 2 1 作用 2 2 上半部和下半部 2 3 中断上下文 3 中断系统 3 1 中断机制的实现 3 2 中断控制 4 下半部和软中
  • python skimage图像处理(一)

    本文转自 python数字图像处理 基于python脚本语言开发的数字图片处理包 比如PIL Pillow opencv scikit image等 PIL和Pillow只提供最基础的数字图像处理 功能有限 opencv实际上是一个c 库
  • mipi dsi接口_Camera MIPI接口详解2

    简介 上一篇文章中 我们简单的介绍了camera接口的类型 有串口和并口和LVDS接口 以及MIPI接口一些电气特性的一些简单的技术探讨 那么我们现在常用的都是mipi接口 需要深入一点去理解MIPI接口的电气特性 有助于我们接下来理解MI
  • 类脑导航的机理、算法、实现与展望

    类脑导航 CBN 是一种新型的导航方式 其机理基于对大脑和动物行为的理解 与传统导航系统不同的是 CBN借鉴了大脑神经元与突触的工作原理 通过人工神经网络学习和模拟动物的行为 使导航过程更加具有灵活性和适应性 CBN涉及到的算法主要是基于机
  • 区分接口继承和实现继承——条款34

    表面上直截了当的public继承概念 经过严密的检查之后 发现它由两部分组成 函数接口 function interfaces 继承和函数实现 function implementations 继承 这两种继承的差异 很像本书导读所讨论的函
  • 【贪心算法】哈夫曼编码问题

    问题描述 哈夫曼编码是广泛地用于数据文件压缩的十分有效的编码方法 其压缩率通常在20 90 之间 哈夫曼编码算法用字符在文件中出现的频率表来建立一个用0 1串表示各字符的最优表示方式 一个包含100 000个字符的文件 各字符出现频率不同
  • [ Note]python字符串的json 格式化美化输出

    通过爬虫获取到的json文件是字符串 vscode的prettify json失效 参考 json dumps参数之解 python的JSON用法 dumps的各种参数用法 详细 源码 jsonfile json dumps json文件
  • volatile的讲解以及宏定义和立即数

    volatile关键字 是用于表明变量代码无法被优化 比如 int a 0 a 1 a 2 a 3 经过编译器代码优化后 int a 0 a 3 省去重复工作 debug下不会作任何优化 但这样的代码效率一般只用在调试下 release模式
  • 2013小米笔试题--异形数

    题目 一个数组里 除了三个数是唯一出现的 其余的都出现偶数个 找出这三个数中的任一个 比如数组元素为 1 2 4 5 6 4 2 只有1 5 6这三个数字是唯一出现的 我们只需要输出1 5 6中的一个就行 分析 一般这样的题目采用异或的办法
  • nvm安装node ,yarn

    新电脑安装前端环境 1 先安装nvm 它是一个nodejs的版本管理工具 nvm 下载地址是github中的 推荐下载安装版 一键安装 自动配置环境变量 https github com coreybutler nvm windows re
  • HTTP协议系列教材 (二)- 借助FireFox火狐调试工具学习HTTP协议 

    对于HTTP协议的学习 我们将借助火狐浏览器FIREFOX的调试工具来实际观察浏览器和服务器之间传输数据的具体内容 步骤1 下载 FireFox步骤2 打开调试工具步骤3 观察 request response 步骤 1 下载 FireFo
  • 解决Jmeter返回数据中文乱码问题

    步骤1 修改jmeter中的配置文件jmeter properties的配置项sampleresult default encoding 修改为utf 8 解除注释后重启Jmeter 步骤2 添加后置处理器 BeanShell PostPr

随机推荐

  • 跟我学Java设计模式第三天:代理模式、适配器、装饰者等其中模式结构

    5 结构型模式 结构型模式描述如何将类或对象按某种布局组成更大的结构 它分为类结构型模式和对象结构型模式 前者采用继承机制来组织接口和类 后者釆用组合或聚合来组合对象 由于组合关系或聚合关系比继承关系耦合度低 满足 合成复用原则 所以对象结
  • Java实现自定义注解

    前言 1 Java实现自定义注解其实很简单 跟类定义差不多 只是属性的定义可能跟我们平时定义的属性略有不同 这里会给大家详解 先来看代码 Target ElementType FIELD Retention RetentionPolicy
  • C++使用string的大数运算(4)除法

    本次项目目标 使用C 完成对于大数的相关运算 项目要点 1 大数指的是远超long long int的数据 2 将大数用矩阵进行存储 并通过矩阵实现运算 3 本人采用字符串进行存储 应注意char的特点 比如 char a 161 cout
  • OpenErp的权限

    首先引用一篇入门文章 http www oscg cn openerp develop doc 09 可以发现 其实openerp的权限分成了多层次的 菜单 视图 对象 规则 从字面意思就是每层都控制着自己对应的权限 然后我创建了一个新的g
  • HTML5 canvas 计算文字宽度的方法(measureText)

    var c document getElementById myCanvas var ctx c getContext 2d ctx font 30px Arial var txt Hello World ctx fillText widt
  • IEEE 802.3ad 链路聚合与LACP的简单知识&EtherChannel 总结

    IEEE 802 3ad 链路聚合与LACP的简单知识 内容提要 本文主要介绍了链路聚合的概念以及链路聚合与EtherChannel 以太通道 的区别 说明 IEEE 802 3ad 是执行链路聚合的标准方法 从概念上讲 将多个以太网适配器
  • 国内首个行业级燃机智慧运维云平台是如何炼成的?

    在未来的能源结构转型中 燃气发电将发挥重要作用 这似乎颠覆了人们日常认知 众所周知 在碳达峰 碳中和的环保目标下 我国能源结构正迎来根本性变革 传统化石能源占比将逐步下降 绿色低碳的新能源占比将持续提升 为何还要推动燃气发电的发展 这绝非虚
  • android edittext setonkeylistener,Android EditText 键入事件 —setOnKeyListener

    main xml android orientation vertical android layout width fill parent android layout height fill parent gt android layo
  • Vue简单示例——weex

    weex的生命周期 因为我们的Weex和Vue是绑定在一起的 所以我们讨论关于生命周期时 说的实际上是在Weex中可以使用的Vuex的生命周期 也就是Weex对于Vue生命周期的支持 好消息 Weex支持大部分的Vue中的生命周期钩子函数
  • apple mobile device服务无法启动,错误1053 解决

    本文转载自 https www cnblogs com relax p 3476741 html 作者 relax 转载请注明该声明 我不想安装iTunes 于是下了iTunes64安装包 解压后得到6个文件 安装完 AppleMobile
  • 进程的描述与控制(二)_OS

    目录 1 进程与线程的比较 2 线程的实现方式 内核支持线程 KST 用户级线程 ULT ULT KST 组合方式 3 进程同步的概念 4 两种形式的制约关系 5 临界资源 6 对临界资源访问的过程 7 同步机制应该遵循的规则 8 解决临界
  • 轻松应对IDC机房带宽突然暴涨问题

    轻松应对IDC机房带宽突然暴涨问题 1 提出问题 实际案例一 凌晨3 00点某公司 网站业务 的一个IDC机房带宽流量突然从平时高峰期150M猛增至1000M 如下图 该故障的影响 直接导致数百台服务器无法连接 该机房全部业务中断 实际案例
  • [深度学习实战]基于PyTorch的深度学习实战(下)

    目录 一 前言 二 Mnist手写数字图像识别 2 1 加载数据 2 1 1 下载地址 2 1 2 用 numpy 读取 mnist npz 2 2 定义卷积模型 2 3 开始训练 2 4 完整代码 2 5 验证结果 2 6 修改参数 三
  • vue项目中的路由配置

    公司的项目使用vue脚手架来搭建 是属于后台管理系统 功能页比较多 就使用vue路由来进行跳转 个人比较习惯上面这种方式放置路由文件 并且使用懒加载的模式来配置 如下 import Vue from vue import Router fr
  • qemu 出现Could not access KVM kernel module: No such file or directory failed to initialize KVM: No su...

    使用qemu命令 qemu system x86 64 hda image ubuntu test img cdrom ubuntu 16 04 2 server amd64 iso m 1024 enable kvm boot d 安装u
  • Android终端Termux安装MariaDB/MySQL数据库

    前言 Android移动设备并非设计为服务器 尽管其中一些功能强大 但是 随着技术的进步以及我们可以用手机做更多的事情 总是很有趣的 今天 借助Termux应用程序 我们将了解如何在Android上安装MySQL或MariaDB数据库 为此
  • Linux常用命令学习

    原文转自https www cnblogs com gaojun p 3359355 html 1 ls命令 就是list的缩写 通过ls 命令不仅可以查看linux文件夹包含的文件 而且可以查看文件权限 包括目录 文件夹 文件权限 查看目
  • unity学习-委托(delegate),事件(event),Action,Func

    unity学习 委托 含义 定义 使用 事件 含义 使用 在进行项目的过程中 一直存在着对代码管理不当的问题 所以需要学习一些科学的代码思维 减少后期功能的修改与迭代引发的代码冗杂和内存爆炸 可以看b站这个大神的视频 讲的可以说无敌详细了
  • echarts问题记录

    X轴最后一个刻度标签加粗 问题描述 如图最后一个刻度标签加粗 解决 是因为加了interval 0导致 这个属性又不能去掉 查看文档发现可以使用function 改为interval gt true axisLabel interval g
  • ros下src中的CMakeLists.txt解析

    toplevel CMakeLists txt for a catkin workspace catkin cmake toplevel cmake src下的CMakeLists txt是由toplevel生成的 cmake minimu