g++使用
$ g++ 111.cpp
//当前目录下生成了一个a.out文件
$ ./a.out
//运行此程序
cmake使用
理论上说,任意一个C++程序都可以用g++来编译。但当程序规模越来越大时,一个工程可能有许多个文件夹和源文件,这时输入的编译命令将越来越长。通常一个小型C++项目可能含有十几个类,各类间还存在着复杂的依赖关系。其中一部分要编译成可执行文件,另一部分编译成库文件。如果仅靠g++命令,我们需要输入大量的编译指令,整个编译过程会变得异常烦琐。因此,对于C++项目,使用一些工程管理工具会更加高效。
————视觉slam十四讲
//创建文件CMakeLists.txt
cmake_minimum_required(VERSION 2.8)
//声明cmake要求的最低版本
project(HelloSLAM)
//创建一个cmake工程
add_executable(helloslam init.cpp)
//添加一个可执行文件
//语法:add_excutable( 程序名 源代码文件 )
$ make . //生成中间文件
$ make //生成可执行文件
$ ./filename //执行文件
常见的编译方式是先建一个文件夹,使中间文件在其中生成,方便之后删除
$ mkdir build
$ cd bulid
$ camke..
$ make
c++库
库是许多算法、程序的集合。
SLAM算法中常用的库如计算机视觉相关的opencv库和处理矩阵的Eigen库。
在Linux中,库分为静态库和共享库两种。静态库以.a作为后缀名,共享库为.so。所有库都是一些函数打包后的集合,差别在于静态库每次被调用都会生成一个副本,共享库只有一个副本,更省空间。
以下演示如何使用cmake打包
//filename:helloworld.cpp
#include<iostream>
using namespace std;
void PrintHello(){
cout<<"helloworld"<<endl;
}
一个.cpp文件,包含一个输出helloworld的函数
//CMakeLists.txt
add_library(hello helloworld.cpp)
//下面是共享库生成方式
//add_library(hello_shared SHARED helloworld.cpp)
这条命令告诉cmake,我们想把这个文件编译成一个叫做hello的库
之后和上面一样,在终端使用cmake编译整个工程
$ cd build
$ cmake ..
$ make
之后在build文件夹里会生成一个libhello.a/libhello_shared.so的文件,这就是得到的库
得到这个库之后,不能直接调用,必须要提供一个头文件,其中包含库中的函数声明
对于库的使用者,只要拿到头文件和库文件,就可以调用这个库了
//filename:helloworld.h
#ifndef HELLOWORLD_H_
#define HELLOWORLD_H_
void printHello();
#endif
main函数
//filename:useHello.cpp
#include "helloworld.h"
int main(){
printHello();
return 0;
}
然后,在CMakeLists.txt中添加一个可执行程序的生成命令,链接到刚才的库上:
//书接上文
add_executable(useHello useHello.cpp)
target_link_libraries(useHello hello hello_shared)