SLAM从入门到精通(CMake编译)

news2024/11/26 16:37:01

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】

        linux系统里面的编译和windows下面的编译不同,它没有什么特别好用的IDE。一般都需要自己写编译脚本。这项工作在以前可能很麻烦,但是现在一般都被cmake取代了。cmake本身不能直接编译代码,它也是通过脚本生成复杂的makefile,借助于makefile来编译生成可执行文件的。所以说,cmake的本质,其实就是降低我们个人写makefile的难度。我们所要做的,就是写好cmake脚本,剩下来的事情,和之前的make工具并无差别。

 

1、单一可执行程序

        假设我们需要编写一个可执行文件,它的文件名叫helloSLAM.cpp,代码是这样的,

#include <iostream>
using namespace std;

int main(int argc, char* argv[])
{
	std::cout << "Hello, SLAM" << std::endl;
	return 0;
}

        这个时候需要做的,就是在同级目录下创建一个CMakeLists.txt文件,

cmake_minimum_required(VERSION 2.8)

project(helloSLAM)

add_executable(helloSLAM helloSLAM.cpp)

        有了这个cmake脚本,下面可以先创建一个debug目录,cd到debug目录下,输入cmake ..就可以看到这样的打印,

feixiaoxing@feixiaoxing-VirtualBox:~/Desktop/slam/prj1/debug$ cmake ..
-- The C compiler identification is GNU 9.4.0
-- The CXX compiler identification is GNU 9.4.0
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Configuring done
-- Generating done
-- Build files have been written to: /home/feixiaoxing/Desktop/slam/prj1/debug

        这个时候,其实cmake已经帮助我们生成好了makefile,直接输入make就可以编译了,

feixiaoxing@feixiaoxing-VirtualBox:~/Desktop/slam/prj1/debug$ make
Scanning dependencies of target helloSLAM
[100%] Building CXX object CMakeFiles/helloSLAM.dir/helloSLAM.cpp.o
Linking CXX executable helloSLAM
[100%] Built target helloSLAM

2、生成静态库

        生成静态库,其实就是说把软件按照各个模块先分别编译成.a文件。等所有的.a文件都ok之后,下面就可以链接成最终的执行文件。这里,我们对helloSLAM.cpp修改一下,方便生成.a文件,

#include <iostream>
using namespace std;

void printHello()
{
	std::cout << "Hello, SLAM" << std::endl;
}

        代码和之前相比,其实就是删除了main函数,取而代之的是printHello函数。与此对应的CMakeLists.txt也要发生修改,

cmake_minimum_required(VERSION 2.8)

project(helloSLAM)

add_library(hello helloSLAM.cpp)

        同样经过观察,我们发现,CMakeLists.txt中的add_executable已经被add_library代替,那么目标也从生成可执行文件,变成了生成静态库文件。同样mkdir debug & cmake .. & make之后,就会发现这样的打印,

feixiaoxing@feixiaoxing-VirtualBox:~/Desktop/slam/prj2/debug$ make
Scanning dependencies of target hello
[100%] Building CXX object CMakeFiles/hello.dir/helloSLAM.cpp.o
Linking CXX static library libhello.a
[100%] Built target hello

3、生成动态库

        生成动态库的流程和生成静态库非常相似,所要修改的地方就是CMakeLists.txt这一个文件,

cmake_minimum_required(VERSION 2.8)

project(helloSLAM)

add_library(hello_shared SHARED  helloSLAM.cpp)

        虽然CMakeLists中的目标还是add_library,但是中间多了一个SHARED关键字。就是这个关键字,我们会发现最终生成的是.so文件,而不是.a文件。和.a文件相比,.so文件不占地方,程序有bug,只要修复一个.so文件即可。这里可以看下mkdir debug & cmake .. & make之后的结果是什么样的,

feixiaoxing@feixiaoxing-VirtualBox:~/Desktop/slam/prj3/debug$ make
Scanning dependencies of target hello_shared
[100%] Building CXX object CMakeFiles/hello_shared.dir/helloSLAM.cpp.o
Linking CXX shared library libhello_shared.so
[100%] Built target hello_shared

4、编译带动态库的可执行文件

        既然生成了静态库,或者动态库,就要看下怎么把相关的文件链接到最终的可执行文件中去。这里主要有四步。第一步把3中生成的so文件copy到当前目录下;第二步,接着修改helloSLAM.cpp文件,

#include <iostream>
using namespace std;

#include "helloSLAM.h"

int main(int argc, char* argv[])
{
	printHello();
	return 0;
}

        注意,这里多了一个helloSLAM.h文件,所以第三步需要继续添加一个头文件,

#ifndef _HELLO_SLAM_H
#define _HELLO_SLAM_H

void printHello();

#endif

        最后一步,就是修改CMakeLists.txt文件,

cmake_minimum_required(VERSION 2.8)

project(helloSLAM)

link_directories("/home/feixiaoxing/Desktop/slam/prj4")
add_executable(helloSLAM helloSLAM.cpp)
target_link_libraries(helloSLAM hello_shared)

        和最初的可执行文件相比较,这里多了两个内容。第一,添加了link_directories,也就是告诉编译工具,链接库在哪里可以找到;第二,增加了一个target_link_libraries,它表明最终的可执行文件一定要带上hello_shared这个共享库文件。经过上面的操作之后,就可以看看最终的结果是啥样的了,

feixiaoxing@feixiaoxing-VirtualBox:~/Desktop/slam/prj4$ mkdir debug
feixiaoxing@feixiaoxing-VirtualBox:~/Desktop/slam/prj4$ cd debug/
feixiaoxing@feixiaoxing-VirtualBox:~/Desktop/slam/prj4/debug$ cmake ..
-- The C compiler identification is GNU 9.4.0
-- The CXX compiler identification is GNU 9.4.0
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Configuring done
-- Generating done
-- Build files have been written to: /home/feixiaoxing/Desktop/slam/prj4/debug
feixiaoxing@feixiaoxing-VirtualBox:~/Desktop/slam/prj4/debug$ make
Scanning dependencies of target helloSLAM
[100%] Building CXX object CMakeFiles/helloSLAM.dir/helloSLAM.cpp.o
Linking CXX executable helloSLAM
[100%] Built target helloSLAM
feixiaoxing@feixiaoxing-VirtualBox:~/Desktop/slam/prj4/debug$ ./helloSLAM 
Hello, SLAM

        看上去和最初的单文件编译没区别。但是大家要注意下,这里的helloSLAM.cpp没有printHello的实现过程,所以最终helloSLAM可以运行起来,肯定有动态库的功劳。通过输入ldd命令也可以证明这一点,

feixiaoxing@feixiaoxing-VirtualBox:~/Desktop/slam/prj4/debug$ ldd ./helloSLAM 
	linux-vdso.so.1 (0x00007ffeedad7000)
	libhello_shared.so => /home/feixiaoxing/Desktop/slam/prj4/libhello_shared.so (0x00007fdb9a036000)
	libstdc++.so.6 => /lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007fdb99e38000)
	libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fdb99c46000)
	libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fdb99af7000)
	/lib64/ld-linux-x86-64.so.2 (0x00007fdb9a042000)
	libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007fdb99adc000)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/938722.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

cmd: Union[List[str], str], ^ SyntaxError: invalid syntax

跑项目在调用from easyprocess import EasyProcess 遇到报错&#xff1a; cmd: Union[List[str], str], ^ SyntaxError: invalid syntax猜测是EasyProcess版本与python版本不对应 pip show EasyProcess查证一下&#xff1a; WARNING: pip is being invoked by an old…

深入了解OpenStack:创建定制化QCOW2格式镜像的完全指南

OpenStack 创建自定义的QCOW2格式镜像 前言 建议虚机网络配置为 NAT 或 桥接&#xff0c;因为未来 KVM虚机 需要借助 虚机 的外网能力进行联网安装软件包 虚机在启动前&#xff0c;必须在 VMware Workstation 上为其开启虚拟化引擎 虚拟化 Intel VT-x/EPT 或 AMD-V 安装kvm …

【git进阶】 .ignore 忽略有道 忽略核查gitcheck-ignore -v

git .ignore配置 .ignore使用场景新项目中.gitignore用法1 初始化生成.git文件夹2 git status 查看当前文件夹状态3 创建.ignore文件 忽略不想上传的文件4 编辑.gitignore文件 git status查看是否生效 .gitignore进阶用法模式匹配模式匹配例题练习1 忽略所有的内容2 忽略所有目…

深入理解树状数组

大家好&#xff0c;我是 方圆。关于各类区间和问题有很多种解法&#xff0c;我们可以根据题目要求选择解题的方向&#xff1a; 数组不变&#xff0c;区间查询&#xff1a;前缀和、树状数组和线段树 数组单点查询&#xff0c;区间查询&#xff1a;树状数组 和线段树 数组区间修…

“业务敏捷的领导力” 工作坊 · 2023年9月3日

“业务敏捷的领导力”在线工作坊 2023年9月3日&#xff1b;9:30-11:30 am 授课工具&#xff1a;Zoom分组Miro画布互动练习 讲师&#xff1a;Jim Wang王军 报名条件 优先捷行学员免费参加&#xff0c;报名2023后半年课程的学员免费&#xff0c;工作坊限定30人&#xff0…

【附安装包】Fireworks CS6安装教程

软件下载 软件&#xff1a;Fireworks版本&#xff1a;CS6语言&#xff1a;简体中文大小&#xff1a;165.87M安装环境&#xff1a;Win11/Win10/Win8/Win7硬件要求&#xff1a;CPU2.0GHz 内存4G(或更高&#xff09;下载通道①百度网盘丨下载链接&#xff1a;https://pan.baidu.c…

STM32启动模式详解

文章目录 前置知识1. 单片机最小系统组成2. BOOT电路3. 三种启动模式4. 存储器映射 从主FLASH启动从系统存储区启动从SRAM启动 前置知识 1. 单片机最小系统组成 一个单片机最小系统由电源、晶振、下载电路、BOOT电路、和复位电路组成。少一个单片机都启动不了。 2. BOOT电路 …

华为云Stack的学习(二)

三、华为云Stack产品组件 FunsionSphere CPS 提供云平台的基础管理和业务资源&#xff08;包括计算资源和存储资源&#xff09;。采用物理服务器方式部署在管理节点。可以做集群的配置&#xff0c;扩容和运维管理。 Service OM 提供云服务的运维能力&#xff0c;采用虚拟化方…

线程基础:Java多线程的创建休眠与等待

目录 一.Thread 类是什么? 二.Thread 类的几个常见属性 三.线程创建 1. 继承Thread&#xff0c;重写 run 方法 2. 实现Runnable&#xff0c;重写 run 方法 3. 继承Thread&#xff0c;使用匿名内部类 4. 实现Runnable&#xff0c;使用匿名内部类 5. 使用 lambda 表达式…

大数据-玩转数据-Flink窗口

一、Flink 窗口 理解 在流处理应用中&#xff0c;数据是连续不断的&#xff0c;因此我们不可能等到所有数据都到了才开始处理。当然我们可以每来一个消息就处理一次&#xff0c;但是有时我们需要做一些聚合类的处理&#xff0c;例如&#xff1a;在过去的1分钟内有多少用户点击…

医疗器械行业的MES系统解决方案

医疗器械行业的MES系统&#xff08;制造执行系统&#xff09;解决方案是为医疗器械制造企业提供的一种集成化的信息技术系统&#xff0c;用于管理和监控制造过程&#xff0c;提高生产效率&#xff0c;确保产品质量&#xff0c;以及优化整个生产流程。MES系统通常涵盖了生产计划…

No118.精选前端面试题,享受每天的挑战和学习

文章目录 为什么说HTTP是无状态的协议&#xff1f;HTTP 报文结构是怎样的&#xff1f;HTTP1.1 中如何解决 HTTP 的队头阻塞问题&#xff1f;HTTP 中如何处理表单数据的提交&#xff1f;说下application/x-www-form-urlencoded 和 multipart/form-data对于定长和不定长的数据&am…

影视公司技术流程设计之Pipeline数据管理

使用场景 1 设计师画好设计稿后怎样让导演审查&#xff1f; 叫到位子上看&#xff1f; 放个文件夹会议室统一看&#xff1f;意见怎么记录&#xff0c;怎么反馈&#xff1f; 2 材质&#xff0c;绑定文件怎么与模型同步&#xff0c; 很多时间是绑定不小心改了&#xff0c; 去了灯…

WinRAR<6.23 远程代码执行漏洞【Poc公开】(CVE-2023-38831) [有POC]

漏洞类型代码注入发现时间2023-08-25漏洞等级高危MPS编号MPS-bw2s-d0rvCVE编号CVE-2023-38831漏洞影响广度广 漏洞危害 OSCS 描述WinRAR 是一款适用于 Windows 系统的压缩包管理器。 WinRAR 6.2.3之前版本打开压缩文件时会调用 ShellExecute 函数匹配文件名&#xff0c;如果目…

软件设计师(十一)标准化和软件知识产权基本知识

一、标准化基础知识 标准(Standard)是对重复性事物和概念所做的统一规定 标准化工作的特征包括横向综合性、政策性和统一性 1、基本概念 &#xff08;1&#xff09;标准的分类 国际标准&#xff1a;ISO、IEC等国际标准化组织国家标准&#xff1a;GB一中国、ANSI一美国、BS一…

AIGC领航,智能AI赋能乡村教育,梦想扬帆远航

一位扎根深山支教十年的湖北教师袁辉的故事曾经感受无数人&#xff0c;新华社、人民日报都撰文为他点赞。在他带过的学生中&#xff0c;有一位名叫青青的女学生患有成骨不全症&#xff0c;俗称“瓷娃娃”&#xff0c;学校离家十几公里山路&#xff0c;上学对她来说&#xff0c;…

Java注解与反射

&#x1f497;wei_shuo的个人主页 &#x1f4ab;wei_shuo的学习社区 &#x1f310;Hello World &#xff01; Java注解与反射 Java注解和反射是Java语言中两个强大的特性&#xff0c;它们可以一起使用以实现动态的、灵活的编程和元数据处理 注解 Java注解&#xff08;Annotatio…

振弦采集读数模块开发原理详细介绍

飞讯教学篇&#xff1a;振弦采集读数模块开发原理详细介绍 振弦采集读数模块是一种用于采集弦振信息的模块&#xff0c;其原理是通过传感器感知弦的振动&#xff0c;将其转化为电信号&#xff0c;然后经过模拟处理和数字化处理&#xff0c;最终输出为可供后续处理的数字信号。…

Python照片压缩教程:如何轻松减小图片大小

介绍 在日常的编程工作中&#xff0c;我们经常需要处理图像&#xff0c;例如上传、下载、显示、编辑等。有时候&#xff0c;我们需要对图像进行压缩&#xff0c;以减少占用的空间和带宽&#xff0c;提高加载速度和用户体验。那么&#xff0c;如何用Python来实现图像压缩呢&…

【数据分析】统计量

1. 均值、众数描述数据的集中趋势度量&#xff0c;四分位差、极差描述数据的离散程度。 2. 标准差、四分位差、异众比率度量离散程度&#xff0c;协方差是度量相关性。 期望值分别为E[X]与E[Y]的两个实随机变量X与Y之间的协方差Cov(X,Y)定义为&#xff1a; 从直观上来看&…