cmake学习笔记6-catkin的CmakeList.txt讲解

2023-12-18 05:38

本文主要是介绍cmake学习笔记6-catkin的CmakeList.txt讲解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

是这篇博文把我引到这篇的

https://blog.csdn.net/sinat_16643223/article/details/114012486

摘自:https://www.jianshu.com/p/551d6949b49d

cmake学习笔记6-catkin的CmakeList.txt讲解

scott_yu779

0.1452018.01.22 17:55:11字数 2,082阅读 4,431

引用
cmake学习笔记-cmakelist.txt创建项目示例
cmake的介绍和使用 Cmake实践
推荐cmake手册详解
严重推荐CMake构建系统的骨架
catkin_make做了什么

基础变量

  • 例如:

我在/home/yuhs/novatel_ws建立了一个novatel的工作空间

在我的电脑上有如下目录地址:
/home/yuhs/novatel_ws/devel/lib
/home/yuhs/novatel_ws/devel/lib/novatel
/home/yuhs/novatel_ws/devel/lib/novatel/novatel_node

/home/yuhs/novatel_ws/src/novatel/include/novatel
/usr/local/include/novatel

打印这些catkin系统变量信息如下:
CATKIN_PACKAGE_LIB_DESTINATION:lib
CATKIN_PACKAGE_BIN_DESTINATION:lib/novatel
CATKIN_PACKAGE_INCLUDE_DESTINATION:include/novatel

基础知识

  • CMakeList.txt 文件中,命令名字是不区分大小写的,而参数和变量是大小写相关的

  • ros的包 catkin_make后,可执行文件在./devel/lib/proj_name/proj_name_node

catkin_package()

  • 参数解析
    在Extracted CMake API reference文档中搜索catkin_package()可以查看官方的说明doc,加深对以下参数的理解
    1、INCLUDE_DIRS:
    2、LIBRARIES:lib_name,这个lib_name的库会出现在这个catkin的catkin_LIBRARIES宏变量中,同时也会出现在${PROJECT_NAME}_LIBRARIES宏变量中,别的工程是可以通过find_package找到这个lib_name库的,
    3、CATKIN_DEPENDS:proj_name,此list中的内容,本质是catkin的项目,同时也是被此项目(这个cmakelist所在的这个工程项目)所依赖的catkin工程项目,此项目会通过find_package()或pkg-config来调用这些list中的内容;
    4、DEPENDS:proj_name,此list中的内容,本质是cmake的项目,同时也是被此项目(这个cmakelist所在的这个工程项目)所依赖的cmake工程项目,此项目会通过find_package()或pkg-config来调用这些list中的内容;
    5、CFG_EXTRAS:外部配置文件
    6、EXPORTED_TARGETS
    7、SKIP_CMAKE_CONFIG_GENERATION
    8、SKIP_PKG_CONFIG_GENERATION
catkin_package(INCLUDE_DIRS includeLIBRARIES novatelCATKIN_DEPENDS serial roslib roscpp rosconsole tf gps_msgs nav_msgs sensor_msgsDEPENDS Boost)

FIND_PACKAGE

  • FIND_PACKAGE 功能解释:
    会在全局,全盘寻找指定name的库,然后找到了后,就会将name_xxxx等变量赋值,就可以用对应的变量了,举例说明吧
    比如下面这些变量,就会被赋值
<NAME>_FOUND 
<NAME>_INCLUDE_DIRS or <NAME>_INCLUDES
<NAME>_LIBRARIES or <NAME>_LIBS
<NAME>_DEFINITIONS
  • 命令用法:
    find_package(<package> [version] [EXACT] [QUIET]
    [[REQUIRED|COMPONENTS] [components...]]
    [NO_POLICY_SCOPE])

  • 例如:
    find_package(Boost 1.49.0 COMPONENTS unit_test_framework serialization)
    Boost就是package,COMPONENTS 后面跟着的就是列出的一些与包相关的部件清单,这句话我也没太理解,以后再补充,

当找到package后,Boost_INCLUDE_DIR这个变量就是被赋值了的,这都是自动化完成的

  • REQUIRED 参数
    其含义是指是否是工程必须的,表示如果报没有找到的话,cmake的过程会终止,并输出警告信息。对应于

  • COMPONENTS
    如何理解这个参数

     

    COMPONENTS参数的含义

  • version参数
    需要一个版本号,它是正在查找的包应该兼容的版本号(格式是major[.minor[.patch[.tweak]]])。

  • EXACT选项
    要求版本号必须精确匹配。如果在find-module内部对该命令的递归调用没有给定[version]参数,那么[version]和EXACT选项会自动地从外部调用前向继承。对版本的支持目前只存在于包和包之间(详见下文)。

QUIET 参数:
会禁掉包没有被发现时的警告信息。对应于Find<name>.cmake模块中的 NAME_FIND_QUIETLY。

  • 和catkin相关的查找包
    如下所示:
find_package(catkin COMPONENTS serial roslib roscpp rosconsole tf gps_msgs nav_msgs sensor_msgs)

加入了catkin的关键字,每个ros的包都至少有一个find_package需要依赖catkin这个包
上面命令解释:查找catkin包,并且这个catkin包依赖组件:serial roslib roscpp rosconsole tf gps_msgs nav_msgs sensor_msgs

project()

如果子文件夹Cmakelists.txt当中没有project(name_xxx1),那么使用PROJECT_NAME就会继承父文件夹当中的project(name_xxx)定的 name_xxx1,如果子目录当中的Cmakelists.txt当中定义过project(name_xxx2),那么子目录当中的Cmakelists.txt当中的 PROJECT_NAME就会是子Cmakelists.txt定义的这个name_xxx

add_subdirectory()

add_subdirectory 会去这个指定的目录寻找子cmakelists.txt
在交叉目录 需要寻找头文件的时候,调用者的目录当中的CMakeLists.txt当中添加头文件路径

include_directories()

  • 增加单个目录
    include_directories(include)
  • 增加多个目录
    include_directories(include ${catkin_INCLUDE_DIRS} ${Boost_INCLUDE_DIRS})

库相关的指令

引用:跟库相关的几个命令讲解的帖子
http://blog.csdn.net/arackethis/article/details/43488177
http://blog.csdn.net/michaelhan3/article/details/69568362

1、ADD_LIBRARY

ADD_LIBRARY 告诉工程,生成一个库,并将源码链接到具体名字的库当中
例如:
add_library(lib_name ${SRC_LISTS}) #将集合里的所有的源文件生成一个静态库,该静态库的名字lib_name,注意,在整个CmakeLists里都要用lib_name这个

  • BUILD_SHARED_LIBS
    这个参数属于catkin系统的参数,如果是on,则add_library构建的则是SHARED类型的库,就是动态库,如果是off,那么就是static的库
  • 位置
    这个命令构建完毕的动态库所在位置如下所示():
    /home/yuhs/novatel_ws/devel/lib/libnovatel.so

2、TARGET_LINK_LIBRARIES

  • TARGET_LINK_LIBRARIES

语法:TARGET_LINK_LIBRARIES(targetlibrary1 <debug | optimized> library2 ..)

比如(以下写法(包括备注中的)都可以):
TARGET_LINK_LIBRARIES(myProject hello),连接libhello.so库到myProject(可执行文件)当中
TARGET_LINK_LIBRARIES(myProject libhello.a)
TARGET_LINK_LIBRARIES(myProject libhello.so)

再如:
TARGET_LINK_LIBRARIES(myProject libeng.so)  #将libeng.so链接到myProject中。
TARGET_LINK_LIBRARIES(myProject eng)
TARGET_LINK_LIBRARIES(myProject -leng)

target_link_libraries(lib_name #链接静态库需要的依赖库
${OpenCV_LIBS}
${PROJECT_SOURCE_DIR}/lib/libCommonUtilities.so
${PROJECT_SOURCE_DIR}/lib/libInuStreams.so
)
从这个例子当中可以看出target_link_libraries功能,如果第一个是静态库(因为没有用shared相关的关键词,所以为静态),那么就是把其他库也连接到这个静态库当中,第一个参数也可以是执行文件,然后将库链接到可执行的应用文件中,如下例子所示

3、LINK_DIRECTORIES(添加需要链接的库文件目录,这个是增加目录)

语法:
link_directories(directory1 directory2 ...)
它相当于g++命令的-L选项的作用,也相当于环境变量中增加LD_LIBRARY_PATH的路径的作用。
比如:
LINK_DIRECTORIES("/opt/MATLAB/R2012a/bin/glnxa64")
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$MATLAB/bin/glnxa64

4、LINK_LIBRARIE(添加需要链接的库文件的全路径,这个是增加具体的库文件)

List of direct link dependencies.
比如:
LINK_LIBRARIES("/opt/MATLAB/R2012a/bin/glnxa64/libeng.so")
LINK_LIBRARIES("/opt/MATLAB/R2012a/bin/glnxa64/libmx.so")
也可以写成:
LINK_LIBRARIES("/opt/MATLAB/R2012a/bin/glnxa64/libeng.so" "/opt/MATLAB/R2012a/bin/glnxa64/libmx.so")

不同命令之间的关系讲解

1、生成可执行文件和链接库之间

先生成可执行文件,后把库连接到可执行文件中即可
add_executable(hello ${APP_SRC})
target_link_libraries(hello libhello)

链接工程的各种方法

1、把子模块的src源码 先链接为库,在把库连接到main可执行文件中

  • 理解

  • 例子说明,如下所示:

project(HELLO)
set(LIB_SRC hello.c)
set(APP_SRC main.c)
add_library(libhello ${LIB_SRC})
add_executable(hello ${APP_SRC})
target_link_libraries(hello libhello)

里面有一点不爽,对不?
因为我的可执行程序(add_executable)占据了 hello 这个名字,所以 add_library 就不能使用这个名字了
然后,我们去了个libhello 的名字,这将导致生成的库为 libhello.lib(或 liblibhello.a),很不爽
想生成 hello.lib(或libhello.a) 怎么办?
添加一行
set_target_properties(libhello PROPERTIES OUTPUT_NAME "hello")
就可以了

2、源码添加到APP_SRC这种变量中,然后利用add_executable统一链接到main的可执行文件中

  • 理解
  • 例子说明

list

  • list(APPEND <list> [<element> ...])
    将element内容追加到list当中

install

cmake:install学习

  • 1、install(TARGETS detect_cl img_tool test_detect
    RUNTIME DESTINATION bin
    LIBRARY DESTINATION lib
    ARCHIVE DESTINATION lib/static)
    【命令解析】:
    将生成的target安装到指定目录下,这里 detect_cl,img_tool是动态库,test_detect是可执行程序,
    cmake会自动根据target的类型将可执行程序(如.exe)和动态库(如.dll)作为RUNTIME类型复制到bin下,
    将动态库的导入库(.lib .a)作为ARCHIVE类型复制lib/static目录下
  • install(DIRECTORY include/${PROJECT_NAME}/
    DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION}
    FILES_MATCHING PATTERN ".h" PATTERN ".svn" EXCLUDE )
    【命令解析】:
    1、DESTINATION 会被${CATKIN_PACKAGE_INCLUDE_DESTINATION}替代
    2、include/${PROJECT_NAME}/
    DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION} = include/novatel/include/novatel
    具体可以参照文章开头的描述信息,我的工作空间是以novatel作为例子分析
    3、FILES_MATCHING PATTERN "
    .h"意思:匹配所有.h的文件
    4、PATTERN ".svn" EXCLUDE意思:后面加了exclude,表明排除.svn的匹配

这篇关于cmake学习笔记6-catkin的CmakeList.txt讲解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/507211

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

计算机毕业设计 大学志愿填报系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点赞 👍 收藏 ⭐评论 📝 🍅 文末获取源码联系 👇🏻 精彩专栏推荐订阅 👇🏻 不然下次找不到哟~Java毕业设计项目~热门选题推荐《1000套》 目录 1.技术选型 2.开发工具 3.功能

线性代数|机器学习-P36在图中找聚类

文章目录 1. 常见图结构2. 谱聚类 感觉后面几节课的内容跨越太大,需要补充太多的知识点,教授讲得内容跨越较大,一般一节课的内容是书本上的一章节内容,所以看视频比较吃力,需要先预习课本内容后才能够很好的理解教授讲解的知识点。 1. 常见图结构 假设我们有如下图结构: Adjacency Matrix:行和列表示的是节点的位置,A[i,j]表示的第 i 个节点和第 j 个