catkin_make学习总结

2023-05-16

catkin_make学习总结

    • 基础概念
    • 常用函数理解与注释
    • 其他有用的函数总结
    • 简单实例
    • 参考链接

基础概念

  1. CMakeLists.txt 文件中,命令名字是不区分大小写的,而参数和变量是大小写相关的
  2. ros的包 catkin_make后,可执行文件在./devel/lib/proj_name/proj_name_node

常用函数理解与注释

1. cmake_minimum_required(VERSION 2.8.3)

   	每一个 catkin CMakeLists.txt 必须以 CMake 需要的版本开始,Catkin 需要版本 2.8.3 或者更高

2. project(project-name)

	定义工程名称,执行后则编译时可以使用变量 ${PROJECT_NAME}
	注:
	(1)如果子文件夹 CMakeLists.txt 中没有语句: project(PROJECT_NAME)
		那么使用PROJECT_NAME就会继承父文件夹中的CMakeLists.txt定义
	(2)如果子文件夹中的CMakeLists.txt有定义,则按照定义进行

3. find_package( [VERSION] [EXACT] [QUIET] [MODULE][REQUIRED] [[COMPONENTS] [components…]] [OPTIONAL_COMPONENTS components…])

 	在全局,全盘寻找指定name的库,找到后,就会将name_xxxx等变量赋值,就可以用对应的变量了
    举例说明:
 	   <NAME>_FOUND
 	        若找到package,则此变量为1,否则为0
 	    <NAME>_INCLUDE_DIRS or <NAME>_INCLUDES
 	        头文件的路径
 	    <NAME>_LIBRARIES or <NAME>_LIBS
 	        库文件的路径
 	    <NAME>_VERSION_STRINGS
 	        版本信息的字符串
         
    关键字解释:
		VERSIONEXACT: 
			都是可选的,version指定的是版本,如果指定就必须检查找到的包的版本是否和version兼容。
			如果指定EXACT则表示必须完全匹配的版本而不是兼容版本就可以。
   		QUIET:
   			可选字段,表示如果查找失败,不会在屏幕进行输出
   			但是如果指定了REQUIRED字段,则QUIET无效,仍然会输出查找失败提示语。
		MODULE:
     		可选字段,前面提到说“如果Module模式查找失败则回退到Config模式进行查找”
     		但是假如设定了MODULE选项,那么就只在Module模式查找,
     		如果Module模式下查找失败并不回落到Config模式查找。
		REQUIRED:
			可选字段,表示一定要找到包,找不到的话就立即停掉整个cmake。
			而如果不指定REQUIRED则cmake会继续执行。
 		COMPONENTS components...:
 			可选字段,表示查找的包中必须要找到的组件(components)
 			如果有任何一个找不到就算失败,类似于REQUIRED,导致cmake停止执行。
 		OPTIONAL_COMPONENTS components...:
 			可选的模块,找不到也不会让cmake停止
 		
 	举例:
         find_package(Boost 1.49.0 COMPONENTS unit_test_framework serialization)
         Boost就是package,COMPONENTS 后面跟着的就是列出的一些与包相关的部件清单,若找不到,cmake停止执行

4. catkin_package()

   	参数解释:	
		INCLUDE_DIRS(字符串列表)
			– CMAKE_CURRENT_SOURCE_DIRC / C ++的相对路径
		LIBRARIES(字符串列表)
			–lib_name,这个lib_name的库会出现在这个catkin的catkin_LIBRARIES宏变量中,
			同时也会出现在${PROJECT_NAME}_LIBRARIES宏变量中,
			别的工程是可以通过find_package找到这个lib_name库的。
			当前,如果逻辑目标名称与安装的名称不同,则此操作将中断。
		CATKIN_DEPENDS(字符串列表)
			此项目所依赖的catkin项目列表。当代码可以通过find_package()或pkg-config找到该项目时,将使用它。
			列出的每个项目必须是已经被find_package或在.pc文件中的被使用。
			因此,需要添加它们的INCLUDE_DIRSLIBRARIES。
			只有在保证它们可以find_package并且具有pkg-config文件的情况下,
			才应使用这种catkin项目。一般来说这种项目为ros下的项目。
		DEPENDS(字符串列表)
			此项目所依赖的CMake项目的列表。
			由于它们可能不能被find_packag或缺少pkg-config文件以及变量INCLUDE_DIRSLIBRARIES因此将它们直接传递。这就要求它已被find_package()找到
			或者是拥有变量(<name>_FOUND,<name>_INCLUDE_DIRS,等)CFG_EXTRAS(字符串)
			一个负责外部配置的CMake文件
			其中包含find_package-ing 之后该程序包的用户应该可以访问的其他内容。
			该文件必须位于子目录中cmake或为绝对路径。所有传递的额外文件都必须具有唯一的基名,
			因为它们被安装到单个文件夹中。可以有各种附加的文件扩展名:对于一个普通cmake的文件只是.cmake
			对于使用的CMake的展开的文件configure_file()使用.cmake.in或文件通过empy使用扩展.cmake.em。
			模板可以使用布尔变量DEVELSPACE 和来区分devel-和installspace INSTALLSPACE。
			如果设置了全局变量$ {PROJECT_NAME} _CFG_EXTRAS,它将放在显式传递的参数之前。
		EXPORTED_TARGETS(字符串列表)
			通常会生成代码的目标名称列表。
			下游程序包可以取决于这些目标,以确保在使用代码之前就已生成它们。生成CMake配置文件将确保目标存在。
			如果设置了全局变量$ {PROJECT_NAME} _EXPORTED_TARGETS,它将放在显式传递的参数之前。
		SKIP_CMAKE_CONFIG_GENERATION(bool)
			跳过为软件包生成CMake配置文件的选项
		SKIP_PKG_CONFIG_GENERATION(bool)
			跳过为软件包生成pkg-config文件的选项

	举例:
		1. catkin_package(DEPENDS Boost)
			catkin 将 find_package(Boost)(作用于全局), 并向 ${your_pkg_LIBRARIES} 添加 ${Boost_LIBRARIES}, 
			向 ${your_pkg_INCLUDE_DIRS} 添加 ${Boost_INCLUDE_DIRS}, 但是应该先进行find_package()
		2. catkin_package(CATKIN_DEPENDS roscpp std_msgs)
			CATKIN_DEPENDS 选项和 DEPENDS 选项十分相似,但是对于CATKIN_DEDPENS来说,
			你只能在其列表中放置 catkin 程序包(即是用roscreate-pkg创建的程序包)3.catkin_package(
	       INCLUDE_DIRS include
	       LIBRARIES ${PROJECT_NAME}
	       CATKIN_DEPENDS roscpp nodelet
	       DEPENDS eigen opencv
	       )

5. 关于添加消息的操作

	首先在catkin_make()中增加message_runtime的CATKIN_DEPENDS
	然后使用add_message_files() 添加定义好的消息文件,格式为 xxx.msg.
	最后告诉cmake配置生成消息相关文件,使用generate_messages()
    举例:
		catkin_package(
		       ...
		       CATKIN_DEPENDS message_runtime ...
		       ...
		)
		add_message_files(
		       FILES
		       xxx.msg(自己更改定义的文件名)
		)
		generate_messages(
			   DEPENDENCIES
			   std_msgs
		)

	附:添加消息的一般操作步骤(不止是修改cmakelist文件)
    >>>首先是修改package.xml文件,确保该文件中与message有关的内容没有被注释掉。
    >>>然后修改CMakeist.txt文件: 
        在find_package函数中加入message_generation依赖;
        在catkin_package函数中加入message_runtime依赖;
        修改add_message_file函数,添加入自己创建的Num.msg文件;
        或者在add_service_file函数中添加入自己创建的srv文件;
        确保generate_messages函数被调用运行,去掉注释符号#;
    >>>重新编译生成软件包,会生成对应消息的头文件,include之后就可以在程序中对消息进行编程操作。

6. include_directories(, , …, )

	添加头文件目录,以包含find_package路径以及其他需要的路径。
	参数形如:
		*_INCLUDE_DIRS
    举例:使用catkin and Boost ,形式如下:
	include_directories(
	       include 
	       ${Boost_INCLUDE_DIRS} 
	       ${catkin_INCLUDE_DIRS}
	)

7. link_directories(, , …, )

	添加需要链接的库文件目录,用来加载外加的=动态链接库或静态链接库的搜索路径,相当于gcc的-L参数
    举例:
	link_directories(
       /usr/local/cuda/lib64
     )

8. link_libraries()

	添加需要链接的库文件路径,注意这里是全路径
    举例:
	LINK_LIBRARIES("/opt/MATLAB/R2012a/bin/glnxa64/libeng.so")

9. target_link_libraries()

	将其他库与已有的库进行链接,添加链接库,相同于指定-l参数
    举例:
	//以下这些库名写法都可以。
	TARGET_LINK_LIBRARIES(myProject libeng.so)  
    TARGET_LINK_LIBRARIES(myProject eng)
    TARGET_LINK_LIBRARIES(myProject -leng)

10. add_library( [STATIC | SHARED | MODULE] [EXCLUDE_FROM_ALL] source1 source2 … sourceN)

	添加一个名为<name>的库文件,该库文件将会根据调用的命令里列出的源文件来创建。
	<name>对应于逻辑目标名称,而且在一个工程的全局域内必须是唯一的。
	待构建的库文件的实际文件名根据对应平台的命名约定来构造(比如lib<name>.a或者<name>.lib)
	指定STATICSHARED,或者MODULE参数用来指定要创建的库的类型。
	STATIC库是目标文件的归档文件,在链接其它目标的时候使用。
	SHARED库会被动态链接,在运行时被加载。MODULE库是不会被链接到其它目标中的插件,
	但是可能会在运行时使用dlopen-系列的函数动态链接。如果没有类型被显式指定,
	这个选项将会根据变量BUILD_SHARED_LIBS的当前值是否为真决定是STATIC还是SHARED.
    举例:
	add_library(
		${PROJECT_NAME}_lib		#使用当前项目名称做为库名称
		src/YoloObjectDetector.cpp
	)

11. add_executable( [WIN32] [MACOSX_BUNDLE] [EXCLUDE_FROM_ALL] source1 source2 … sourceN)

	使用给定的源文件,为工程引入一个可执行文件
    举例:
	add_executable(
		${PROJECT_NAME}
		src/yolo_object_detector_node.cpp
	)

12. add_dependencies(target-name depend-target1 depend-target2 …)

	为顶层目标引入一个依赖关系。让一个顶层目标依赖于其他的顶层目标。
	一个顶层目标是由命令ADD_EXECUTABLEADD_LIBRARY,或者ADD_CUSTOM_TARGET产生的目标。
	为这些命令的输出引入依赖性可以保证某个目标在其他的目标之前被构建。
    举例:
	add_dependencies(
        <target-name> 
        ${${PROJECT_NAME}_EXPORTED_TARGETS} 
        ${catkin_EXPORTED_TARGETS}
    )

13. add_definitions(-DFOO -DBAR …)

	添加编译宏定义,为源文件的编译添加由-D引入的define flag
    举例:
	add_definitions(-DDARKNET_FILE_PATH="${DARKNET_PATH}")

14. message([SEND_ERROR | STATUS | FATAL_ERROR] “message to display”)

	在执行cmake时打印消息 
    举例:
	message(STATUS "Darknet path dir = ${DARKNET_PATH}")

15. generate_dynamic_reconfigure_options(xxx.cfg …)

	生成动态参数配置文件
    举例:
    generate_dynamic_reconfigure_options(
      cfg/Tutorials.cfg
    )

其他有用的函数总结

(i) set_target_properties() 函数

	用于库文件重命名输出
	举例:
	set_target_properties(
	    rviz_image_view
	    PROPERTIES OUTPUT_NAME image_view
	    PREFIX ""
	)

(ii) 自定义输出路径:

	目标文件的默认路径有时候必须改为自定义的路径。自定义的路径中,有一些默认的规则。
	举例:
	set_target_properties(
		python_module_library
		PROPERTIES LIBRARY_OUTPUT_DIRECTORY
		${CATKIN_DEVEL_PREFIX}/${CATKIN_PACKAGE_PYTHON_DESTINATION}
	)

(iii) add_subdirectory(source_dir [binary_dir] [EXCLUDE_FROM_ALL])

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

简单实例

add_library,target_link_libraries,set_target_properties,target_link_libraries使用联系

	project(Camera_sugan)                 #工程名字
	cmake_minimum_required(VERSION 2.6)   #编译最低cmake版本
	set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11" )   #设置c++编译器
	find_package(OpenCV REQUIRED)         #在整个电脑上找opencv包
	include_directories(                  #包含头文件路径
	    ./include/inudev/
	    ./src/
	)
	set(SRC_LISTS                         #将所有的源文件列为一个集合,集合名字叫做SRC_LISTS
	    ./src/inuitive.cpp
	    ./src/runCamera_Qfeeltech.cpp
	)
	add_library(libsugan ${SRC_LISTS})    #将集合里的所有的源文件生成一个静态库,该静态库的名字libsugan,注意,在整个CmakeLists里都要用libsugan这个名字来代替之前那个集合生成的库。
	target_link_libraries(libsugan        #链接静态库需要的依赖库
	    ${OpenCV_LIBS}
	    ${PROJECT_SOURCE_DIR}/lib/libCommonUtilities.so
	    ${PROJECT_SOURCE_DIR}/lib/libInuStreams.so
	)

存储出来的结果就是liblibsugan.a,看着很别扭,为了大众点,我们用下面这句,保证了存储出来的静态库叫做libsugan.a 想更改可以使用以下函数

	set_target_properties(libsugan PROPERTIES OUTPUT_NAME "sugan")

#如果想链接生成的这个库必须使用 “add_library(libsugan ${SRC_LISTS})”指明的名字

	add_executable(demo ./src/main.cpp)
	target_link_libraries(demo libsugan)

参考链接

  1. catkin_package()是什么意思?
  2. CMake命令
  3. 深入理解CMake(3):find_package()的使用
  4. cmake学习笔记6-catkin的CmakeList.txt讲解
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

catkin_make学习总结 的相关文章

  • 文件系统编译进内核

    1 利用busybox制作根文件目录 需要有init 和 linuxrc 2 makemenuconfig 在general setup 中设置 initial ram filesystem and RAM disk 后指定文件系统源文件路
  • 零基础制作平衡小车【连载】13---平衡小车代码讲解(附源码)

    前言 今天聊一聊代码 xff0c 只有直立功能的代码 代码总体思路 给定一个目标值 xff0c 单片机通过IIC和mpu6050通信 xff0c 得知数据后 xff0c 根据角度环计算出一个PWM值给电机驱动器 xff0c 从而控制单机转动
  • NRF51822---开发板介绍(连载1)

    无线遥控器项目先放一放吧 xff0c 要学习的东西太多了 xff0c 一开始以为很简单 xff0c 结果坑越挖越深 还保持采用NRF51822的方案做手柄 xff0c 在做之前先把51822这个骨头啃下来 我又重新开了一个专题 xff0c
  • nrf51822+rfx2401c系统板(开源原理图、PCB)

    快过年了 xff0c 没啥东西可送的 xff0c 就把刚做的射频板子开源了吧 原理图 3D图 板子还有点毛病 xff0c 不过问题不大 把PCB隔断 xff0c 飞根线就行了 xff0c 等你拿到手就能看到了 下图中画黑色圈的两个过孔把信号
  • 无名小哥对无名飞控中的问题回答总结

    文章目录 IIR二阶数字低通陀螺仪数据噪声传感器矫正姿态解算惯性导航控制滤波性能系统响应巴特沃斯滤波器的截止频率如何取累计漂移姿态估计精度误差大控制周期时间保证传感器数据不丢帧 IIR二阶数字低通 对于IIR而言 xff0c 阶次越高 xf
  • Vue反向代理服务器

    在项目中创建 vue config js 文件 module exports 61 devServer proxy 39 api 39 target 39 http localhost 3000 39 pathRewrite 39 api
  • putty连接centos7 Network error:connection timed out

    首先说明一下 xff0c centos7系统下的开机服务不再在 etc inittab的管理之下了 xff0c centos7使用systemd模块管理系统的服务 xff0c 所有的服务文件都改为 etc systemd system的 s
  • ESP32_使用天猫精灵利用巴法云控灯例程测试

    1 说明 虽然官方例程写的是ESP8266 xff0c 但是改一下就能直接用到ESP32的 xff0c 参考这个链接 xff1a esp8266接入天猫精灵教程 xff0c 附开源app控制 巴法开放论坛 xff0c 整个过程非常非常简单
  • 附录A 进阶游戏编程书籍总结与推荐

    章节导读 很多游戏编程书籍都有一个通病 xff0c 一本书写完 xff0c 读者看完之后 xff0c 不知道下一步该如何前进 这里的附录就是让大家看完这本书后 xff0c 知道自己接下来可以学习什么 xff0c 如何进一步提升自己 为学习思
  • 最受欢迎的菜品

    7 2 最受欢迎的菜品 20分 某自助餐厅要求餐厅的客人在就餐后进行投票 xff0c 选出一款最喜爱的菜品 xff0c 每日营业结束后进行投票统计 xff0c 选出投票数最多的菜品为最受欢迎的菜品 请编写一个程序帮助餐厅快速完成这个统计工作
  • 利用grafana&prometheus 快速配置k8s监控面板 & 主机监控面板

    系列文章目录 1 使用helm快速安装 grafana amp prometheus 2 利用grafana amp prometheus 快速配置 k8s amp 主机监控 3 grafana amp prometheus 快速配置报警规
  • 使用idea创建一个简单的servlet项目

    在创建一个简易的项目之前首先需要在idea配置好tomcat的环境 xff08 1 xff09 点击add configuration xff08 2 xff09 点击 xff0b 号 xff08 3 xff09 选择好你的tomcat版本
  • 为什么我们需要uCos?带你透彻理解RTOS

    与uCos见面还是大学的时候 xff0c 老师让我为毕业设计选一个课题 xff0c 要求有关嵌入式实时操作系统 xff0c 于是开始在网上搜索 xff0c 顺理成章的就发现了uCos xff0c 于是开始了uCos之路 xff0c 但后来由
  • 多旋翼PID控制器笔记

    多旋翼PID控制器笔记 高度控制垂向速度环加速度指令到油门指令的映射垂向加速度环 水平控制水平速度环水平加速度到姿态的映射姿态环欧拉运动学方程角速度环欧拉动力学方程 高度控制 垂向速度环 垂向速度指令在NED坐标系下给出 xff0c 采用P
  • WGS-84坐标系

    WGS 84坐标系 WGS84坐标系基本参数地理坐标曲率半径WGS 84与NED坐标系的转换 WGS84坐标系 WGS 84坐标系 xff08 World Geodetic System一1984 Coordinate System xff
  • MPU6050在ROS中应用

    arduino下读取MPU6050数据 参考 xff1a http diyhacking com arduino mpu 6050 imu sensor tutorial 硬件 arduino uno或arduino mega2560mpu
  • 工作空间目录

    PathGo导航模块的默认固定IP是192 168 31 200 xff0c 默认用户名为eaibot xff0c 密码为 eaibot span class hljs variable span ssh eaibot span class
  • 嵌入式软件工程师求职需要的基本技能

    总结一下 嵌入式软件工程师 一般需要会的技能 xff0c 也可以为自己接下来的学习做一个规划 xff1a 1 C C 43 43 编程基础扎实 xff1b 2 熟悉ARM体系结构 熟悉Linux操作系统 xff1b 3 熟悉多线程编程 xf
  • 信号量、邮箱和消息队列

    信号量像一把钥匙 xff0c 任务要运行下去 xff0c 需先拿到这把钥匙 消息邮箱是一个指针型变量 可以向一个任务或一个中断服务子程序发送一则消息 xff08 一个指针 xff09 xff0c 同样 xff0c 一个或多个任务通过内核服务
  • ROS单线程与多线程处理

    ROS wiki xff1a http wiki ros org ROS API xff1a https docs ros org en api roscpp html index html ROS单线程与多线程处理 xff1a http

随机推荐