CMakeList.txt在大型文件应用(SLAM常用库添加依赖项)

2023-12-18 05:38

本文主要是介绍CMakeList.txt在大型文件应用(SLAM常用库添加依赖项),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

摘自:https://zhuanlan.zhihu.com/p/149191302?utm_source=wechat_session

CMakeList.txt在大型文件应用(SLAM常用库添加依赖项)

晓伟Liu

晓伟Liu

CSDN无人驾驶博客ID try_again_later

基本的CMakeLists.txt并不难,主要有生成库、生成执行文件、链接二者以及找库find_package、找头文件include_directories、生成执行文件add_executable、链接库和执行文件target_link_libraries两种方法组成。

但是遇到大型库的编写,目标是生成一个新的大型库myslam,生成执行文件、链接二者。需要提前声明生成执行文件在bin,库在lib中,并把OPenCV、Sophus这些库整合到一个大型的第三方库THIRD_PARTY_LIBS中,供后面的target_link_libraries(myslam ${THIRD_PARTY_LIBS})用。myslam中包括两部分:frame.cpp、mappoint.cpp、map.cpp等+第三方库THIRD_PARTY_LIBS


一、简单的

1)从头开始:(生成库、生成执行文件、链接二者)

CMakeLists.txt

add_library( hello_shared SHARED libHelloSLAM.cpp ) # 生成库

add_executable( useHello useHello.cpp ) #执行文件

target_link_libraries( useHello hello_shared ) # 链接库到执行文件上

1、先生成库文件libhello_shred.so,需要libHelloSLAM.cpp和add_library(hello_shared SHARED libHelloSLAM.cpp)

2、之后要建立头文件libhellSLAM.h告诉如何调用库里的函数,需要把库连接到可执行文件名中 target_link_libraried(useHello hello_shared)

3、主函数useHello.cpp使用头文件

2)利用现成的库:

只需要建立头文件,说明怎么使用即可。

3)大型的库只需修改CMakeList.txt即可(找库、添加头文件、生成执行文件、链接库和执行文件

头文件也已经建立好了,只需找到库然后加入头文件即可使用

CMakeLists.txt

find_package( OpenCV REQUIRED ) #寻找OpenCV库
include_directories( ${OpenCV_INCLUDE_DIRS})  #添加头文件

add_executable( imageBasics imageBasics.cpp)    #添加可执行文件
target_link_libraries( imageBasics ${OpenCV_LIBS} ) #链接OpenCV库

 


二、大型文件

 

1、我们的目标是:

写一个VO库myslam库,这个库需要自己写在include里的.cpp 五大类以及一些第三方库(Eigen、OpenCV、Sophus、G2O)。

之后需要测试程序生成执行文件run_vo,最后链接myslam库的run_vo,跑效果。

add_library( myslam SHARED

frame.cpp mappoint.cpp map.cpp camera.cpp config.cpp

g2o_types.cpp visual_odometry.cpp )

add_executable( run_vo run_vo.cpp )

target_link_libraries( run_vo myslam )

2、步骤:

根目录的CMakeList.txt生成新的第三方库THIRD_PARTY_LIBS,需要include所有第三方库头文件,并set路径参数。

很多第三方库文件则被整合成了一个大的THIRD_PARTY_LIBS路径变量,以备后面src中生成myslam用target_link_libraries.

src中的CMakeList.txt中生成myslam库,需要五大类.cpp链接到上层定义的THIRD_PARTY_LIBS库文件路径。

test中的CMakeList.txt中就是简单的生成可执行文件run_vo,并将源文件链接到我们写的myslam库文件上。

接下来,对这三个CMakeList.txt分别进行介绍:

先来看根目录下的这个CMakeList.txt:

#定义需求版本和工程名称#
cmake_minimum_required(VERSION 2.8)
project (myslam)#cmake相关的一些设定#
set( CMAKE_CXX_COMPILER "g++" )
set( CMAKE_BUILD_TYPE "Release" )
set( CMAKE_CXX_FLAGS "-std=c++11 -march=native -O3" )#添加cmake_modules到CMAKE_MODULE_PATH路径列表中和
list( APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake_modules )
#设定可执行文件与库文件的输出路径bin、lib
set( EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin )
set( LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib )############### 找第三方库和添加头文件 ######################
# Eigen
include_directories( "/usr/include/eigen3" )
# OpenCV
find_package( OpenCV 3.1 REQUIRED )
include_directories( ${OpenCV_INCLUDE_DIRS} )
# Sophus 
find_package( Sophus REQUIRED )
include_directories( ${Sophus_INCLUDE_DIRS} )
# G2O
find_package( G2O REQUIRED )
include_directories( ${G2O_INCLUDE_DIRS} )#根据库文件路径参数生成第三方库THIRD_PARTY_LIBS
set( THIRD_PARTY_LIBS ${OpenCV_LIBS}${Sophus_LIBRARIES}g2o_core g2o_stuff g2o_types_sba
)
############### 自己写的头文件 ######################
include_directories( ${PROJECT_SOURCE_DIR}/include )#增加子目录#
add_subdirectory( src )
add_subdirectory( test )

然后src中的CMakeList.txt:

#由此一堆生成自己写的一个库文件,名为myslam,这个库是链接在第三方库基础上的。
add_library( myslam SHAREDframe.cppmappoint.cppmap.cppcamera.cppconfig.cppg2o_types.cppvisual_odometry.cpp
)# myslam库需要链接上方定义好的第三方库,${THIRD_PARTY_LIBS}路径参数。
target_link_libraries( myslam${THIRD_PARTY_LIBS}
)

然后test中的CMakeList.txt:

 #最终到这里,添加可执行文件
add_executable( run_vo run_vo.cpp )
#可执行文件链接在自己写的库文件myslam上#
target_link_libraries( run_vo myslam )

注解:

1、当前目录名称为 {PROJECT_SOURCE_DIR},路径表达为 ${PROJECT_SOURCE_DIR}

2、list( APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake_modules )这句的意思也就很明了了,就是将工程根目录下的cmake_modules文件夹路径,添加到CMAKE_MODULE_PATH路径列表中。

3、add_subdirectory 命令。我们的项目各个子项目都在一个总的项目根目录下,该命令可以将指定的文件夹加到build任务列表中。


三、解析多传感器融合的CMakeLists.txt

cmake_minimum_required(VERSION 2.8.3)
project(lidar_localization)SET(CMAKE_BUILD_TYPE "Release")
SET(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall")
add_compile_options(-std=c++11)
add_definitions(-std=c++11)# 加载catkin宏和指定对其他ROS功能包的依赖关系
find_package(catkin REQUIRED COMPONENTSroscpprospystd_msgspcl_rosgeometry_msgstfeigen_conversions
)# 把所有库列为一个集合,后面被target_link_libraries用,避免库名字太长
set(ALL_TARGET_LIBRARIES "")# cmake包放在一个文件夹下
include(cmake/glog.cmake)
include(cmake/PCL.cmake)
include(cmake/eigen.cmake)
include(cmake/geographic.cmake)
include_directories(include ${catkin_INCLUDE_DIRS})# 指定头文件路径
include(cmake/global_defination.cmake)# 空的?
catkin_package()# 所有cpp合并到一个集合(多个node文件编到一个可执行文件中会出错,踢出去)
file(GLOB_RECURSE ALL_SRCS "*.cpp")file(GLOB_RECURSE NODE_SRCS "src/*_node.cpp")
file(GLOB_RECURSE THIRD_PARTY_SRCS "third_party/*.cpp")
list(REMOVE_ITEM ALL_SRCS ${NODE_SRCS})
list(REMOVE_ITEM ALL_SRCS ${THIRD_PARTY_SRCS})# 生成可执行文件,链接库
add_executable(test_frame_node src/test_frame_node.cpp ${ALL_SRCS})
target_link_libraries(test_frame_node ${catkin_LIBRARIES} ${ALL_TARGET_LIBRARIES})

1、find_package和catkin_package

find_package 是 cmake 中常见的宏,用于加载 catkin 宏和指定对其他 ROS 功能包的依赖关系。构建此功能包A需要依赖于

roscpp
rospy
std_msgs
pcl_ros
geometry_msgs
tf
eigen_conversions

catkin_package 宏是 catkin 的宏之一,声明要传递给依赖项目的内容,生成 cmake 配置文件。对依赖于功能包A的其他功能包B来需要依赖其他其他。。。

2、set,file

set(ALL_TARGET_LIBRARIES "")

把所有库列为一个集合,后面被target_link_libraries用,避免库名字太长

与之对应的是:

file(GLOB_RECURSE ALL_SRCS "*.cpp")

所有cpp合并到一个集合

有个类似的表达方式为:将所有.cpp源文件赋值给参数 DIR_SRCS

AUX_SOURCE_DIRECTORY(. DIR_SRCS)

在最后生成可执行文件、链接库的时候,只需要用到ALL_SRCSALL_TARGET_LIBRARIES即可。

# 生成可执行文件,链接库
add_executable(test_frame_node src/test_frame_node.cpp ${ALL_SRCS})
target_link_libraries(test_frame_node ${catkin_LIBRARIES} ${ALL_TARGET_LIBRARIES})

3、.cmake包

# cmake包放在一个文件夹下
include(cmake/glog.cmake)
include(cmake/PCL.cmake)
include(cmake/eigen.cmake)
include(cmake/geographic.cmake)
include_directories(include ${catkin_INCLUDE_DIRS})# 指定头文件路径
include(cmake/global_defination.cmake)v

四、SLAM中常用库的CMakeList.txt写法(如何添加各种依赖库)

1.添加Eigen头文件

Eigen通过apt-get安装之后,我们要怎么使用这个依赖库呢?Eigen有一点很奇怪,Eigen库只有头文件,所以我们在CMakeLists.txt中是不需要写target_link_libraries,因为我们是通过apt安装的,所以很容易的知道Eigen库的位置就是在/usr/include/eigen3

#添加头文件
include_directories("/usr/include/eigen3")

因为我们已经知道Eigen具体的位置,就不用使用find_package来寻找了,虽然有些粗暴,但是简单有效。

2.添加Pangolin依赖
Pangolin的安装也很简单,功能主要就是做三维的可视化显示,主要依赖库是OpenGL,通过apt也很好安装。

find_package(Pangolin)include_directories(${Pangolin_INCLUDE_DIRS})add_executable(project_name filename.cpp)target_link_libraries(project_name ${Pangolin_LIBRARIES})

3.添加Sophus依赖

Sophus实际上是Eigen库的扩展模块,Eigen中虽然有几何模块,但是没有提供李代数的支持,所以Sophus算是一个比较好的李代数库,安装参考之前博文。

find_package(Sophus REQUIRED)
include_directories(${Sophus_INCLUDE_DIRS})
add_executable(project_name project_name.cpp)
target_link_libraries(project_name ${Sophus_LIBRARIES})

4.添加OpenCV依赖

OpenCV经常会出现版本不兼容的问题,LZ同时安装了OpenCV2和OpenCV3两个版本,所以在CMakeLists.txt要指定OpenCV的版本。

#指定OpenCV的版本是3.1
find_package(OpenCV 3.1 REQUIRED)include_directories(${OpenCV_INCLUDE_DIRS})add_executable(project_name filename.cpp)target_link_libraries(project_name ${OpenCV_LIBS})

添加OpenCV要注意一个问题,大小写!很重要!大小写!

5.添加PCL依赖

这个点云库在SLAM应用中还是蛮重要的,通常情况下好像也都有安装,安装很简单,这里还是讲一下CMakeLists.txt中怎么写:

find_package(PCL REQUIRED COMPONENT common io)include_directories(${PCL_INCLUDE_DIRS})add_definitions(${PCL_DEFINITIONS})target_link_libraries(project_name ${PCL_LIBRARIES})

6.添加Ceres依赖

Ceres是Google出品的一个优化库,安装编译都在LZ之前写过一个SLAM安装大全里都有。因为Ceres不是常用的库,所以需要添加一个cmake_modules。

#这行代码就是添加查找Ceres的一个文件
list(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake_modules)find_package(Ceres REQUIRED)include_directories(${CERES_INCLUDE_DIRS})target_link_libraries(project_name ${CERES_LIBRARIES})

7添加G2O的依赖

其实这个也是千篇一律,换汤不换药。这里也是要注意几个问题,第一个,要在cmake_module中假如findG2O的文件。第二个,注意大小写问题,还有数字0和字母0,这个还是要注意的。

list(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake_modules)find_package(G2O REQUIRED)include_directories(${G20_INCLUDE_DIRS})target_link_libraries(project_name g2o_core g2o_stuff)

 

编辑于 2020-06-18

这篇关于CMakeList.txt在大型文件应用(SLAM常用库添加依赖项)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

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

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

JS常用组件收集

收集了一些平时遇到的前端比较优秀的组件,方便以后开发的时候查找!!! 函数工具: Lodash 页面固定: stickUp、jQuery.Pin 轮播: unslider、swiper 开关: switch 复选框: icheck 气泡: grumble 隐藏元素: Headroom

中文分词jieba库的使用与实景应用(一)

知识星球:https://articles.zsxq.com/id_fxvgc803qmr2.html 目录 一.定义: 精确模式(默认模式): 全模式: 搜索引擎模式: paddle 模式(基于深度学习的分词模式): 二 自定义词典 三.文本解析   调整词出现的频率 四. 关键词提取 A. 基于TF-IDF算法的关键词提取 B. 基于TextRank算法的关键词提取

水位雨量在线监测系统概述及应用介绍

在当今社会,随着科技的飞速发展,各种智能监测系统已成为保障公共安全、促进资源管理和环境保护的重要工具。其中,水位雨量在线监测系统作为自然灾害预警、水资源管理及水利工程运行的关键技术,其重要性不言而喻。 一、水位雨量在线监测系统的基本原理 水位雨量在线监测系统主要由数据采集单元、数据传输网络、数据处理中心及用户终端四大部分构成,形成了一个完整的闭环系统。 数据采集单元:这是系统的“眼睛”,

无人叉车3d激光slam多房间建图定位异常处理方案-墙体画线地图切分方案

墙体画线地图切分方案 针对问题:墙体两侧特征混淆误匹配,导致建图和定位偏差,表现为过门跳变、外月台走歪等 ·解决思路:预期的根治方案IGICP需要较长时间完成上线,先使用切分地图的工程化方案,即墙体两侧切分为不同地图,在某一侧只使用该侧地图进行定位 方案思路 切分原理:切分地图基于关键帧位置,而非点云。 理论基础:光照是直线的,一帧点云必定只能照射到墙的一侧,无法同时照到两侧实践考虑:关

每天认识几个maven依赖(ActiveMQ+activemq-jaxb+activesoap+activespace+adarwin)

八、ActiveMQ 1、是什么? ActiveMQ 是一个开源的消息中间件(Message Broker),由 Apache 软件基金会开发和维护。它实现了 Java 消息服务(Java Message Service, JMS)规范,并支持多种消息传递协议,包括 AMQP、MQTT 和 OpenWire 等。 2、有什么用? 可靠性:ActiveMQ 提供了消息持久性和事务支持,确保消

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

hdu1394(线段树点更新的应用)

题意:求一个序列经过一定的操作得到的序列的最小逆序数 这题会用到逆序数的一个性质,在0到n-1这些数字组成的乱序排列,将第一个数字A移到最后一位,得到的逆序数为res-a+(n-a-1) 知道上面的知识点后,可以用暴力来解 代码如下: #include<iostream>#include<algorithm>#include<cstring>#include<stack>#in

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

常用的jdk下载地址

jdk下载地址 安装方式可以看之前的博客: mac安装jdk oracle 版本:https://www.oracle.com/java/technologies/downloads/ Eclipse Temurin版本:https://adoptium.net/zh-CN/temurin/releases/ 阿里版本: github:https://github.com/