点击上方
“
小白学视觉
”,选择加"
星标
"或“
置顶
”
重磅干货,第一时间送达![](http://mmbiz.qpic.cn/mmbiz_jpg/ow6przZuPIENb0m5iawutIf90N2Ub3dcPuP2KXHJvaR1Fv2FnicTuOy3KcHuIEJbd9lUyOibeXqW8tEhoJGL98qOw/640?wx_fmt=other&wxfrom=5&wx_lazy=1&wx_co=1&tp=webp)
扫描下方二维码,加入前沿学术论文交流星球
!
可以获得最新顶会/顶刊论文的idea解读、解读的PDF
和
CV从入门到精通资料,及最前沿应用
!
「本文介绍了在Linux系统下生成库文件,以及编写头文件来使用该库函数」
我们知道C++工程在编译时,含有main()函数的文件会被生成可执行程序。而那些不含main()函数的代码,编译后一般是被其他程序调用,因此我们可以把他们打包成一个“东西”,
即为库(Library)。
库一般是许多程序和算法的集合,
例如openCV库包含了很多计算机视觉相关算法,Eigen库提供了很多矩阵代数计算的算法。
我们以一个简单的c++文件为例演示如何编写一个库。
在根目录下新建一个cppSpace文件夹,并在该文件夹中新建如下的libHelloWorld.cpp文件:
#include
using namespace std;
void printHello()
{
cout << "Hello world!"<< endl;
}
该库文件较为简单,只提供了一个printHello()函数,调用该函数将得到一条输出信息。
根据cmake的原理,我们在CMakeLists.txt文件中加入以下指令:
add_library( hello libHelloWorld.cpp )
该命令告诉cmake,我们想把该文件编译成一个叫"hello"的库。接下来使用cmake对该工程进行编译,在终端中输入:
运行完以上指令后,目录中生成了一个libhello.a的文件,即我们的库,该库类型为
静态库
,静态库每次调用时都会生成一个副本,较占空间。而
共享库
在多次调用时只产生一个副本,节省空间,生成共享库的方法是在CMakeLists.txt文件中加入以下指令:
add_library( hello_shared SHARED libHelloWorld.cpp )
再次使用cmake对该工程进行编译,就将得到libhello_shared.so文件,此即共享库文件。
如果仅有以上两种格式的文件,我们并不知道里面函数时什么形式的,也不知如何调用他们,为了能让大家使用这些库函数,我们需要编写一个
头文件
,说明这些库里有些什么。对于使用者,只要在程序中声明了该头文件,就可以调用这个库。
头文件是C++程序中开头部分的重要指令,下面以编写libhello.a的头文件为例说明其编写和使用的过程。
在该文件夹(cppSpace文件夹)下,新建libHelloWorld.h头文件:
#ifndef LIBHELLOWORLD_H_
#define LIBHELLOWORLD_H_
void printHello();
#endif
编写得到了我们的头文件libHelloWorld.h,接下来编写一个可执行程序useHello.cpp来调用他:
#include "libHelloWorld.h"
int main()
{
printHello();
return 0;
}
要想使该库函数被成功调用,我们还需要在编译时连接到库文件
libhello.a中,即在CMakeLists.txt文件中加入以下指令:
add_executable( useHello useHello.cpp )
target_link_libraries( useHello hello )
这样,文件useHello.cpp就可以使用hello.a库文件中的库函数了。
至此,库文件和头文件的编写及使用过程就介绍完了。
下载1:OpenCV-Contrib扩展模块中文版教程
在「小白学视觉」公众号后台回复:扩展模块中文教程,即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。在「小白学视觉」公众号后台回复:Python视觉实战项目,即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。