如何使用cmake
代码量较少会采用
g++ xxx.cppp
当程序越来越大时,如果使用g++去编译,会需要输入许多文件名称,会变得很繁琐。
cmake
1,使用cmake命令生成一个makefile文件。
2,然后用make命令去根据makefile的内容去编译整个工程。
具体实例
1,在项目文件夹中创建一个CmakeLists.txt文件
2,CmakeLists.txt文件中包含内容有
#声明要求的cmake最低版本
cmake_minimum_required( VERSION 3.0 )
#声明一个cmake工程
project(Helloslam)
#添加一个可执行程序 程序名 源代码文件
add_executable( hello helloSlam.cpp )
CmakeLists.txt文件主要告诉cmake应该对这个目录要做什么是
cmake .
#在当前目录下
cmake会输出一些编译信息,然后再当前目录下生成一些中间文件,最重要的就是MakeFile。
3,用make命令对整个工程进行编译;
make
4,执行可执行文件
./hello
5,一般情况下,我们不想让cmake的信息留在当前工程文件下,我们会建立一个中间文件夹build,在生成之后会把build文件夹删掉。
mkdir build
cd build
cmake .. //表示编译上一层文件夹
make
使用库
一个库是许多算法和程序的集合,比如说Eigen库,opencv库,如何用cmake生成一个库。
假设有个实现输出的printHello的函数在libHelloSLAM文件里面并且没有main函数
则我们在CMakeLists.txt
add_library( hello libHelloSLAM.cpp )#这条命令告诉cmake把这个文件编译成叫做hello的库
cd build
cmake ..
make
这时候build文件夹会生成一个libhello.a文件,这就是我们得到的库。静态库以.a结尾,共享库以.so结尾。所有库都是一些函数打包后的集合,差别在于静态库每次被调用会生成一个副本,而共享库只有一个副本,节省空间,下面是生成共享库的语句。
add_library( hello_shared SHARED libHelloSLAM.cpp )
此时得到的文件就是libhello_shared.so
调用
库文件是一个压缩包,里面是编译好的二进制函数。那为了使用这个库,我们需要一个头文件来说明这些库里有什么。对于库的使用者,只要拿到了头文件和库文件,就可以调用这个库。
libHelloSLAM.h
#ifndef LIBHELLOSLAM_H_
#define LIBHELLOSLAM_H_
//上面的宏定义是为了防止重复引用这个头文件而硬气的重定义错误
void printHello();
#end if
根据这个头文件和我们刚刚编译得到的库文件,就可以使用printHello函数了。最后我们写一个可执行函数来调用printHello函数。
useHello.cpp
#include "libHelloSLAM.h"
int man(){
printHello();
return 0}
然后再CMakeLists.txt中连接到库
add_executable(useHello useHello.cpp)
target_link_libraries( useHello hello_shared )
总结
1,程序代码由头文件和源文件组成
2,带有main函数的源文件可以编译成可执行程序,其他的编译成库文件(xxx.cc)
3,如果想调用库文件们则需要在带main函数中include头文件,并且将相应的库文件进行链接
add_library( hello_shared SHARED libHelloSLAM.cpp )//编译库文件
add_executable(useHello useHello.cpp)
target_link_libraries( useHello hello_shared )//链接库文件