视觉SLAM十四讲学习笔记---Hello SLAM ch1&ch2
目录1. vim基础保存退出命令i 切换插入esc 退出编译模式输入 :(注意`:`要输入2. 截图快捷键(小kills)3.编译helloslam程序3.1 使用g++命令编译4. 使用cmake编译4.1 编写 cmake 文件4.2调用cmke命令新建工程4.3g++与cmake编译区别4.4使用库文件来实现hello4.5 使用库文件5. 使用IDE5.1新建工程5.2添加相应代码-使用库
目录
1. vim基础保存退出命令
i 切换插入
esc 退出编译模式
输入 :(注意:要输入

:w保存但不退出
:wq 保存并退出
:q退出
:q!强制退出,不保存
:e! 放弃所有修改,从上次保存文件开始再编辑命令历史
2. 截图快捷键(小kills)
- PrtSc – 获取整个屏幕的截图并保存到 Pictures 目录。
- Shift + PrtSc – 获取屏幕的某个区域截图并保存到 Pictures 目录。
- Alt + PrtSc –获取当前窗口的截图并保存到 Pictures 目录。
- Ctrl + PrtSc –获取整个屏幕的截图并存放到剪贴板。
- Shift + Ctrl + PrtSc – 获取屏幕的某个区域截图并存放到剪贴板。
- Ctrl + Alt + PrtSc – 获取当前窗口的 截图并存放到剪贴板。
3. 编译helloslam程序
3.1 使用g++命令编译
g++ helloSLAM.cpp
此时利用ls命令可以看到ch1文件夹下多了一个a.out的可执行文件,其中a.out是该命令默认生成的可执行文件名字(由于我之前编译过,所以目录下还有一些其他文件)
补充:关于g++命令的补充说明
- g++ –c Hello.cc 编译文件,生成目标文件 Hello.o
- g++ Hello.o –o abc 连接 并重命名为可执行文件 abc
- g++ Hello.cc 编译连接一起,生成a.out
- g++ Hello.cc –o hello 生成a.out并命名为hello
例如,
g++ helloSLAM.cpp –o hello
4. 使用cmake编译
理论上说,任意一个C++ 程序都可以用g++ 来编译。但当程序规模越来越大时,一个工程可能有许多个文件夹和里边的源文件,这时输入的编译命令将越来越长。通常一个小型c++ 项目含有十几个类,各类间还存在着复杂的依赖关系。其中一部分要编译成可执行文件,另一部分编译成库文件。如果仅靠g++ 命令,我们需要输入大量的编译指令,整个编译过程会变得异常繁琐。因此,对于C++ 项目,使用一些工程管理工具会更加高效。在历史上工程师们曾使用makefile 进行自动编译,但下面要谈的cmake 比它更加方便
4.1 编写 cmake 文件
在一个cmake 工程中,我们会用cmake 命令生成一个makefile 文件,然后,用make命令,根据这个makefile 文件的内容,编译整个工程首先利用rm命令将之前生成的可执行文件删除,此时ch1文件夹下只包含一个helloslam.cpp文件
# 声明要求的 cmake 最低版本
cmake_minimum_required(VERSION 2.8)
# 声明一个 cmake 工程
project(HelloSLAM)
# 设置编译模式
set(CMAKE_BUILD_TYPE "Debug")
# 添加一个可执行程序
# 语法:add_executable( 程序名 源代码文件 )
add_executable(helloSLAM helloSLAM.cpp)
注意:cmake根据CMakeLists.txt文件生成包含一系列文件的工程,其中生成的最重要的文件时makefile文件,make命令会根据此文件所制定的规则生成一些列文件(文件可能是库文件,也可能是可执行程序)
4.2调用cmke命令新建工程
cmake .
命令使用如下,注意cmake命令后面有一个点(.)(两个点表示上一级目录cmake),此点表示在当前文件夹,故此条命令的意思是在当前文件夹下创建工程。以下是正确创建后输出信息
编译结果如下:(由于本人写的cmakelists.txt 文件带有静态库和共享库,所以结果,多了:libHelloSLAM.h,libHelloSLAM.cpp,useHello.cpp三项)
执行结果如下:
4.3 g++与cmake编译区别
cmake 过程处理了工程文件之间的关系,而make 过程实际调用了g++ 来编译程序。虽然这个过程中多了调用cmake 和make 的步骤,但我们对项目的编译管理工作,从输入一串g++ 命令,变成了维护若干个比较直观的CMakeLists.txt 文件,这将明显降低维护整个工程的难度。比如,当我想新增一个可执行文件时,只需在CMakeLists.txt 中添加一行“add_executable”命令即可,而后续的步骤都是不变的。cmake 会帮我们解决代码的依赖关系,无需我们输入一大串g++ 命令。
4.4使用库文件来实现hello
在一个C++ 工程中,并不是所有代码都会编译成可执行文件。只有带有main 函数的文件才会生成可执行程序。而另一些代码,我们只想把它们打包成一个东西,供其他程序调用。这个东西叫做库。一个库往往是许多算法、程序的集合。在Linux 中,库文件分成静态库和共享库两种¬。静态库以.a 作为后缀名,共享库以.so结尾。所有库都是一些函数打包后的集合,差别在于静态库每次被调用都会生成一个副本,而共享库则只有一个副本,更省空间
# 声明要求的 cmake 最低版本
cmake_minimum_required(VERSION 2.8)
# 声明一个 cmake 工程
project(HelloSLAM)
# 设置编译模式
set(CMAKE_BUILD_TYPE "Debug")
# 添加一个可执行程序
# 语法:add_executable( 程序名 源代码文件 )
add_executable(helloSLAM helloSLAM.cpp)
# 添加hello库
add_library(hello libHelloSLAM.cpp)
# 共享库
add_library(hello_shared SHARED libHelloSLAM.cpp)
# 添加可执行程序调用hello库中函数
add_executable(useHello useHello.cpp)
# 将库文件链接到可执行程序上
target_link_libraries(useHello hello_shared)
4.5 使用库文件
库文件是一个压缩包,里头带有编译好的二进制函数。不过,仅有.a 或.so 库文件的话,我们并不知道它里头的函数到底是什么,调用的形式又是什么样的。为了让别人(或者自己)使用这个库,我们需要提供一个头文件,说明这些库里都有些什么。因此,对于库的使用者,只要拿到了头文件和库文件,就可以调用这个库了
添加头文件
(备注):include有两种形式:1,#include " *.h":表示先在当前工程目录下查找头文件,如果没有再按标准方式查找;这种方式常用于用户自定义头文件的查找。 2,#include<*.h>:表示按标准方式查找头文件,即直接到系统指定的某些目录中去找某些头文件。
mkdir build
cd bulid
cmake ..
make
新建bulid文件进行编译,结果如下:

生成可执行文件 useHello,结果如下:
5. 使用IDE
5.1新建工程
点击上方的工程,选择从模版新建


点击OK
结果生成图如下:
5.2添加相应代码-使用库文件
libhello.cpp文件写入内容:
#include <iostream>
using namespace std;
void printHello()
{
cout<<"hello world!"<<endl;
}
libhello.h写入内容:
#ifndef LIBHELLOSLAM_H_
#define LIBHELLOSLAM_H_
// 上面的宏定义是为了防止重复引用这个头文件而引起的重定义错误
// 打印一句hello的函数
void printHello();
#endif
CMakeLists.txt 写入内容:
cmake_minimum_required(VERSION 2.6)
project(helloslam)
# 添加可执行程序调用hello库中函数
add_executable(helloslam main.cpp)
# 将库文件链接到可执行程序上
target_link_libraries(helloslam hello)
# 添加hello库
add_library(hello libhello.cpp)
install(TARGETS helloslam RUNTIME DESTINATION bin)
5.3 构建,结果如下:

5.4 执行程序
执行程序前需要确保2步,其一就是已经点击过构建按钮(即已经正确编译链接,即cmake和make命令都执行成功,记住:只要make clean过工程,就需要重新构建);其二在点击execute按钮时需要指定启动器,即添加可执行程序的路径,如下
点击execute(运行-配置启动)按钮,如果是第一次运行(或者使用过make clean,或清理过该工程)都会弹出配置启动器的对话框,如下
点击新建-选择最后一项,结果如下:
5.5 调试运行
选择调试或者执行,结果如下
参考博客:
slam学习之旅——hello slam
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)