上一篇写了个最最最简单的cmake使用方式。这篇增加生成库的内容。
在C++中,并不是所有的代码都会被编译成可执行文件。只有带main()函数的文件才会生成可执行文件。而另外的很多代码只是想打包成一坨,以供其他程序调用(比如你写了一个牛逼的双色球预测函数,别人才不管你怎么写的,只要能调用就好了!!),这一坨就叫库!
根据C++我们知道,一个库需要有头文件和库文件。我们来写一个简单的库:
头文件为libHelloSLAM.h
//头文件libHelloSLAM.h
#ifndef LIBHELLOSLAM_H_
#define LIBHELLOSLAM_H_
void printHello();
#endif
很简单,头文件只需要包含函数的声明即可~
库文件为libHelloSLAM.cpp
//库文件libHelloSLAM.cpp
#include <iostream>
using namespace std;
void printHello()
{
cout<<"Hello SLAM"<<endl;
}
也很简单,提供了一个printHello()函数,如果你经常打印这句话的话,就不用每次都自己写了,直接调用这个函数就好了。
好,库写完了,还需要调用库的测试程序,也就是调用这个库的可执行程序。
测试程序为useHello.cpp
//可执行程序useHello.cpp
#include "libHelloSLAM.h"
int main( int argc, char** argv )
{
printHello();
return 0;
}
最后,程序都写好了,既然我们要用cmake,那CmakeLists.txt必不可少!
# 声明要求的 cmake 最低版本
cmake_minimum_required( VERSION 2.8 )
# 声明一个 cmake 工程
project( HelloSLAM )
# 设置编译模式为Debug模式
set( CMAKE_BUILD_TYPE "Debug" )
# 生成一个静态库,会生成一个libhello.a文件
add_library( hello libHelloSLAM.cpp )
# 生成一个共享库,会生成一个libhello_shared.so文件
add_library( hello_shared SHARED libHelloSLAM.cpp )
# 生成可执行文件useHello
add_executable( useHello useHello.cpp )
# 将可执行程序链接到上库文件
target_link_libraries( useHello hello_shared )
这里来看一下CmakeLists.txt,
add_library()指令会生成库:
add_library( hello libHelloSLAM.cpp )
生成静态库、
add_library( hello_shared SHARED libHelloSLAM.cpp )
添加 SHARE 后,生成共享库。
有了库之后,需要链接,
target_link_libraries()
指令将目标文件链接到库文件上。
target_link_libraries( useHello hello_shared )
这里为链接到共享库。
可以发现,add_开头的指令,都会生成东西,add_library生成库,add_executable生成可执行文件。
OK,一切准备妥当,此时文件夹中是这样的:
没啥问题,继续我们就可以四步走战略:
mkdir build
cd build
cmake ..
make
在cmake..
之后,我们看一下build文件夹中有什么(原文件夹中只是多了个build文件夹,没啥看头):
发现,cmake阶段生成了几个文件,当然最重要的就是MakeFile,不过静态库.a文件和共享库.so此步并没有生成。
好,继续make
我们需要的静态库libhello.a、共享库libhello_shared.so、可执行文件useHello都出来了!
运行useHello测试一下:
OK~~~没毛病!
从中我们能看到,cmake阶段真的只是去生成makefile文件,所有的编译链接都是有了makefile之后,在make指令下完成的!!!