CH02
hello slam
#打开Linux终端
#新建文件夹
mkdir slambook2
cd slambook2
mkdir ch2
cd ch2
#新建一个helloslam.cpp文件
touch helloslam.cpp
#vim编写helloslam程序
vim helloslam.cpp
***
#include <iostream>
using namespace std;
int main(int argc, char **argv){
cout << "Hello SLAM" << endl;
return 0;
}
***
#g++编译程序,编译完成后产生一个编译文件a.out
g++ helloslam.cpp
#没有g++,进行sudo apt-get install g++
#运行a.out文件
./a.out
#输出Hello SLAM
文中,将代码放在家目录(/home),如上两个图对比,我们知道新建的文件夹都在/home/gao目录下,常用的cd、ls等目录都是运行位于/bin目录下的可执行文件。
关于vim,常见命令如下:按i,进入插入模式,进行写代码,写完之后,按esc,退出,再按:wq保存并退出,(注意前面的冒号:)
cmake
在一个cmake工程中,我们会用cmake命令生成一个makefile文件,然后用make命令根据这个makefile文件的内容编译整个工程。。仍然以上面的helloSLAM.cpp为例,这次我们不是直接使用g++,而是用cmake来制作一个工程,然后再编译它。在slambook/ch2/中新建一个CMakeLists.txt文件,内容如下:
#声明要求的cmake最低版本
cmake_minimum_required( VERSION 2.8 )
#声明一个cmake工程
project( HelloSLAM )
#添加一个可执行程序
#语法:add_executable( 程序名 源代码文件 )
add_executable( helloSLAM helloslam.cpp )
CMakeLists.txt文件用于告诉cmake我们要对这个目录下的文件做什么事情。CMake-Lists.txt文件的内容需要遵守cmake的语法。这个示例中,我们演示了最基本的工程: 指定一个工程名和一个可执行程序。
现在,在当前目录下 (slambook/ch2/) ,调用cmake对该工程进行分析:
cmake会输出一些编译信息,然后在当前目录下生成一些中间文件,其中最重要的就是MakeFile。由于MakeFile是自动生成的,我们不必修改它。现在,用make命令对工程进行编译:
编译过程中会输出一个编译进度。如果顺利通过,我们就可以得到在CMakeLists.txt中声明的那个可执行程序helloSLAM。执行它。
cmake过程处理了工程文件之间的关系,而make过程实际调用了g++来编译程序。虽然这个过程中多了调用cmake和make的步骤,但我们对项目的编译管理工作,从输入一串g++命令,变成了维护若干个比较直观的CMakeLists.txt文件,这将明显降低维护整个工程的难度。比如,如果想新增一个可执行文件,只需在CMakeLists.txt 中添加一行“add executable”命令即可,而后续的步骤是不变的。cmake会帮我们解决代码的依赖关系,而无须输入一大串g++命令。
现在这个过程中唯一让我们不满的是,cmake生成的中间文件还留在我们的代码文件当中。当想要发布代码时,我们并不希望把这些中间文件一同发布出去。这时我们还需要把它们一个个删除,十分不便。一种更好的做法是让这些中间文件都放在一个中间目录中,在编译成功后把这个中间目录删除即可。所以,更常见的编译cmake工程的做法如下:
我们新建了一个中间文件夹“build”,然后进入build文件夹,通过cmake..命令对上一层文件夹,也就是代码所在的文件夹进行编译。这样,cmake产生的中间文件就会生成在build文件夹中,与源代码分开。当发布源代码时,只要把build文件夹删掉即可。