CMakeList.txt在大型文件应用(以前端为例)

2023-05-16

基本的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 SHARED
    frame.cpp
    mappoint.cpp
    map.cpp
    camera.cpp
    config.cpp
    g2o_types.cpp
    visual_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 COMPONENTS
  roscpp
  rospy
  std_msgs
  pcl_ros
  geometry_msgs
  tf
  eigen_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

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CMakeList.txt在大型文件应用(以前端为例) 的相关文章

  • 4.HLSL Effect(效果框架)

    4 HLSL Effect xff08 效果框架 xff09 进行到这里 xff0c 读者可能会觉得使用着色器多少有些繁琐 xff0c Effect xff08 效果框架 xff09 被提出以解决这些问题 作为一种方法 xff0c Effe
  • 4.2用Effect实现多纹理化效果

    4 2 用 Effect 实现多纹理化效果 前面我们介绍了一个使用像素着色器实现的多纹理化 xff0c 这里用 Effect 框架重新给于实现 xff0c 读者可以比较两者之间的异同 xff0c 体会 Effect 框架给我们带来了哪些方面
  • HLSL初级教程-结语,参考资料

    结语 至此 xff0c HLSL 初级内容介绍完毕 xff0c 相信读者已经对 HLSL 着色器 Effect 等概念有了比较深入的理解 xff0c 并且掌握了 HLSL 编程的基本方法 xff0c 文章中裁去了对 HLSL 语法等细节的讨
  • Unity 3D网页游戏 Demo 展示

    2011 年 xff0c 网页 3D 这一网游开发新趋势逐渐浮出水面 xff0c Unity 作为浏览器及移动设备 3D 引擎领域的佼佼者 xff0c 在国内开始崭露头角 我们团队也完成了首款 Unity Demo 的第一个版本 Demo
  • 用Ogre实现无缝地图

    用 Ogre 实现无缝地图 1 7 版本之前 xff0c 如果想用 Ogre 内建的地形系统实现一个像样的无缝地图 xff0c 恐怕要闹到抓狂 所幸 sinbad 在 1 7 为 Ogre 加入了全新的地形组件 xff0c 它囊括了一个地形
  • 一劳永逸地解决寻路问题

    一劳永逸地解决寻路问题 作者 xff1a PaulT 译者 xff1a trcj 原文 xff1a http www ai blog net archives 000152 html 通常我都会尽量避免对业内游戏产品或开发者们评头论足 但这
  • 口吐莲花

    久不更新blog xff0c 优狗 进展尚可 xff0c 新项目又开 xff0c 忙里偷闲想写点东西 xff0c 一时竟无从下笔 xff0c 以往那种花几天甚至几星期整理一篇技术文章的机会恐怕越来越少了 六月份 优狗 团队新入数名成员 xf
  • Unity3D运行时刻资源管理

    Unity运行时刻资源管理 Asset Bundles 制作 xff1a BuildPipeline BuildAssetBundle 加载 xff1a AssetBundle Load 卸载 xff1a AssetBundle Unloa
  • Unity3D页游《坦克英雄》发布!

    坦克英雄 是一款主打PVP的射击类3D竞技页游 xff0c 它基于Unity引擎 xff0c 以二战坦克为题材 xff0c 既保留了射击类游戏的操作性 xff0c 又缓和了其与页游载体看似相悖的剧烈节奏 xff0c 目前游戏的核心玩法及主体
  • 给我时间

    Jenifer Tell 39 ment de gens veulent Tell 39 ment tre aim s Pour se donner peuvent Tout abandonner Tellement d 39 erreur
  • Docker 查看Image镜像的Dockerfile方法

    Dokcer中使用的Image镜像可能别人写好 xff0c 我们下载来直接使用 xff0c 但有些情况可能不能满足我们的需求 xff0c 那就需要修改镜像 xff0c 一般可以通过在容器中修改 xff0c 之后在生成镜像 xff0c 但有时
  • (三)ROS上位机与stm32进行串口通信

    ROS上位机与stm32进行串口通信 1 1 ROS发送数据1 2 stm32接收数据2 1 stm32发送数据2 2 ROS接收数据上位机串口初始化文件代码下位机stm32的串口配置代码 总代码在文末 xff0c 需要完整的工程文件可以留
  • 智能车摄像头算法——寻线

    寻线 1 灰度图像二值化2 找边线3 获得中线 1 灰度图像二值化 如果使用的是小钻风摄像 xff08 二值化摄像头 xff09 xff0c 就不用再进行软件二值化 使用灰度摄像头 xff0c 就需要这步 以下展示常用的大津法 xff08
  • 【Vue】在vue中命名的时候会遇到 component name “index“ should always be multi-word的解决方案

    Vue 在vue中命名的时候会遇到 component name index should always be multi word的解决方案 文章目录 Vue 在vue中命名的时候会遇到 component name 34 index 3
  • docker容器和镜像的停止和删除

    文章目录 docker容器和镜像的停止和删除1 列出所有docker镜像2 查看正在运行的 或所有的docker容器3 停止所有容器4 删除所有容器5 删除所有镜像通过 image name 删除单个镜像通过 image id 删除单个镜像
  • Windows上应用Docker容器技术的动态代码测试

    转载自维克多汽车技术 xff08 上海 xff09 有限公司 xff0c 作者Vector China 随着软件项目复杂度的提升和不可控的团队资源变更 xff0c 研发组织对DevOps部署的灵活性 可快速迁移和适配CI CD的迭代提出了更
  • 写学术论文的一些感想

    我自己写得是真差 xff01 虽然和我英语程度低有一定的关系 xff0c 最重要的是没有这个基础的底蕴和不明白自己做的东西的意义 所以来总结一下关于学术论文的想法 1 最基础的 xff0c 最重要的 xff0c 你要做出东西来 xff0c
  • kvaser怎么用?Kvaser 汽车CAN通讯协议总线分析仪新手入门常见问题解决方案教程

    logo png 1 驱动安装问题 答 xff1a 驱动程序安装问题通常是由防病毒软件引起的 在驱动程序安装期间 xff0c 常见问题是无法安装枚举服务 解决方案 xff1a 确保您的防病毒软件已关闭 xff0c 然后再次安装驱动程序 2
  • 图解git使用

    1 基本用法 上面的四条命令在工作目录 暂存目录 也叫做索引 和仓库之间复制文件 git add em files em 把当前文件放入暂存区域 对比stage和working dir xff0c 如果有改变就增加 xff1b 如果没有改变
  • Docker容器 - DockerFile详解

    目录 DockerFile 一 是什么 二 构建步骤 DockerFile构建过程 一 DockerFile基础 二 Docker执行DockerFile的流程 三 总结 DockerFile常用保留字 零 参考Tomcat的DockerF

随机推荐

  • Docker网络 - docker network详解

    目录 是什么 一 Docker不启动时默认的网络情况 二 Docker启动时的网络情况 能干什么 常用基本命令 一 ls 1 no trunc 2 DRIVER 3 ID 4 format 二 create 三 rm 四 inspect 五
  • 时间划过的伤痕叫成长

    我要用代码敲出整个世界 也许刚看这句话的时候 很多人都嗤之以鼻 太自大太高傲了 但这是我梦想也是我目标 我出生在一个小县城的普通家庭里 经济状况也只能解决温饱 上高中的时候我就没想着要读大学 我很贪玩 几乎都是和一群 34 狐朋狗友 34
  • CMD终端中一些常用的快捷键

    1 使用键盘上的 xff0c 可以快速定位到上一次执行的命令 2 使用键盘上的tab键 xff0c 可以快速补全路径 3 使用键盘上的esc键 xff0c 能够快速清空当前已经输入的命令 4 输出cls命令 xff0c 可以清空终端
  • github在线简历

    github在线简历 对于找工作 xff0c 不论是对校招还是社招的来说 xff0c 在线简历这个东西还是比较加分的 xff0c 可以让hr和面试官 xff0c 看到你更多的东西 xff0c 比如你的个人项目之类的 xff0c 还是挺不错的
  • nrm ls不显示星号

    npmi切换依赖 xff0c 使用nrm ls命令查看当前下载以来的地址看不到是哪一个 nrm是什么 xff1a nrm 是npm常用镜像源管理工具 xff0c 方便本地切换npm的镜像源 xff0c 因为我们在安装依赖的时候 xff0c
  • npm i安装依赖报错,npm ERR! code EPERM npm ERR! syscall unlink,errno -4048

    我的项目是公司内网的react项目 xff0c 安装依赖的时候报错 xff0c 报错信息如下 解决方案 xff1a 1 删除 npmrc文件 他的位置不是nodejs安装目录npm模块下的那个npmrc文件 而是在C Users 账户 下的
  • element对话框遮罩层和弹出内容样式优先级错误

    代码 加入 append to body 61 34 true 34 就可以了 span class token operator lt span el span class token operator span dialog span
  • van2的弹窗自定义事件

    今天帮别人解决了一个移动端的van2的弹窗自定义事件就记录一下 现在国内开发大多数还是已vue为主 xff0c vue3已经比较火热 xff0c 但是对比vue2来讲 xff0c vue2更加稳定 xff0c 以及一些老项目还是用的vue2
  • svg图形绘画

    最近是在整理项目交接工作的时候 xff0c 把之前遇到的问题难点给找出来 xff0c 梳理一下 这个是做svg画布组态项目遇到的问题 目前组态项目中是使用ts文件 xff0c 定义组态类型和格式 xff0c 将不同的组件渲染在画布以及列表上
  • 基于Spring接口,集成Caffeine+Redis两级缓存

    原创 xff1a 微信公众号 码农参上 xff0c 欢迎分享 xff0c 转载请保留出处 在上一篇文章Redis 43 Caffeine两级缓存 xff0c 让访问速度纵享丝滑中 xff0c 我们介绍了3种整合Caffeine和Redis作
  • 不需要登录的app业务如何记录用户状态

    可以采用app获取设备号并服务端保存设备信息和业务信息的方式 欢迎加入我的QQ技术交流群425783133
  • web前端基础-给td设置宽度

    在实际需求中 xff0c 经常遇到要在table中的td中 xff0c 让用户输入比较长的字符串 xff0c 这时就要使td的宽度能较大 在WEB前端中 xff0c 对于 表格元素中的元素td 直接设置宽度是无法生效的 要想达到给td设置宽
  • Kali Linux 暴力破解 wifi密码

    Kali Linux 暴力破解 wifi密码 注意 xff1a 私自破解他人WiFi属于违法行为 xff0c 我这里使用自己的WiFi热点作为学习和测试 明白了破解原理就知道应该怎么防范了 前期准备 暴力破解需要准备的工具 xff1a ka
  • Docker安装与使用

    Docker安装与使用 介绍容器 xff1a 为什么需要Docker xff1f Docker 的用途 xff1a 特点 xff1a Docker安装Linux下安装 xff1a Windows 下安装 xff1a Docker的架构镜像
  • 前端PHP项目部署后404

    问题 xff1a php项目部署后 xff0c 首页可正常访问 xff0c 但跳转其他页面均为404 xff0c 经查询有以下原因 文件以及文件夹权限错误nginx配置错误 span class token comment 无效404方式
  • VINS-Mono 代码详细解读——初始化1:视觉SFM详解 processImage()+initialStructure()

    Estimator类 目录 processImage 函数 initialStructure 初始化函数 SFM初始化 relativePose 函数 getCorresponding 函数返回两帧匹配特征点3D坐标 solveRelati
  • VINS-Mono 代码详细解读——IMU预积分的残差、Jacobian和协方差 processIMU()+intergrationBase类+imu_factor.h

    前言 xff1a 对第k帧和第k 43 1帧之间所有的IMU进行积分 xff0c 可得到第K 43 1帧的PVQ xff08 位置 速度 旋转 xff09 xff0c 作为视觉估计的初始值 每次qwbt优化更新后 xff0c 都要重新进行积
  • VINS-Mono 理论详细解读——紧耦合后端非线性优化 IMU+视觉的残差residual、Jacobian、协方差、基于舒尔补的边缘化

    本讲是VINS最核心部分了 xff0c 前面经历了 1 xff09 视觉跟踪feature tracker IMU预积分integrationBase类 xff1b 2 xff09 初始化中SFM纯视觉估计滑动窗中所有帧的位姿和3D路标点深
  • 多传感器融合定位1(激光雷达+毫米波雷达)

    前言 LZ最近在看Udacity的无人驾驶课程 xff0c 该课程主要分为三部分 xff0c 第一部分的课程主要使用Python实现的车道线识别 车牌识别等计算机视觉项目 由于我对定位 建图等方面有些知识储备 xff0c 所以先从第二部分课
  • CMakeList.txt在大型文件应用(以前端为例)

    基本的CMakeLists txt并不难 xff0c 主要有生成库 生成执行文件 链接二者以及找库find package 找头文件include directories 生成执行文件add executable 链接库和执行文件targe