1. vim基础保存退出命令

i 切换插入

esc 退出编译模式

输入 :(注意:要输入

在这里插入图片描述

:w保存但不退出

:wq 保存并退出

:q退出

:q!强制退出,不保存

:e! 放弃所有修改,从上次保存文件开始再编辑命令历史
在这里插入图片描述

2. 截图快捷键(小kills)

  1. PrtSc – 获取整个屏幕的截图并保存到 Pictures 目录。
  2. Shift + PrtSc – 获取屏幕的某个区域截图并保存到 Pictures 目录。
  3. Alt + PrtSc –获取当前窗口的截图并保存到 Pictures 目录。
  4. Ctrl + PrtSc –获取整个屏幕的截图并存放到剪贴板。
  5. Shift + Ctrl + PrtSc – 获取屏幕的某个区域截图并存放到剪贴板。
  6. Ctrl + Alt + PrtSc – 获取当前窗口的 截图并存放到剪贴板。

3. 编译helloslam程序

3.1 使用g++命令编译

g++ helloSLAM.cpp

此时利用ls命令可以看到ch1文件夹下多了一个a.out的可执行文件,其中a.out是该命令默认生成的可执行文件名字(由于我之前编译过,所以目录下还有一些其他文件)
在这里插入图片描述
补充:关于g++命令的补充说明

  1. g++ –c Hello.cc 编译文件,生成目标文件 Hello.o
  2. g++ Hello.o –o abc 连接 并重命名为可执行文件 abc
  3. g++ Hello.cc 编译连接一起,生成a.out
  4. 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

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐