C++编译(g++、cmake、c++库使用)

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)

猜你喜欢

转载自blog.csdn.net/qq_38830492/article/details/127505059