[查看Windows下生成动态库调用详解]
基于OpenCV图像处理项目生成动态链接库并进行.so的调用,首先生成动态库是基于OpenCV开发环境进行,而调用部分通过服务器远程连接进行测试调用。
Linux下和Windows下生成动态库基本类似,手动创建目录用于存放所有的项目文件,并在本目录下进行所有的操作
hello.h文件
#ifndef _HELLO_H
#define _HELLO_H
extern "C"{
int opencv_main(char str[]);
}
#endif
这里头文件中也需要添加extern “C”,具体查看Windows下讲解
hello.cpp文件
#include "hello.h"
#include //加上函数实现需要的头文件
#include
#include
using namespace std;
using namespace cv;
extern "C"
int opencv_main(char str[])
{
cout << "str=" << str << endl;
Mat Image = imread(str);
imshow("Image", Image);
waitKey(0);
return 0;
}
到现在就可以编译生成.so文件了
g++ -shared -fPIC -o libhello.so hello.cpp
运行这行命令行生成libhello.so文件
注意,-shared参数和-fPIC参数非常重要:
-shared 告诉gcc要生成的是动态链接库;
-fPIC 告诉gcc生成的生成的代码是非位置依赖的,方面的用于动态链接。
最后进行测试
main.cpp
#include "hello.h"
#include
#include
int main()
{
char str[]="/opencv/nine.png";
opencv_main(str);
return 0;
}
这是在本地环境下(带有OpenCV运行环境),程序的图片路径需要自己进行设置
g++ -o main main.c -L. -lhello
运行可生成可执行文件main
-L.: 在当前路径下寻找.so文件
-lhello: 要链接这个libhello.so文件
如果出现如下问题
表示没有链接到本地OpenCV的环境,命令行后面加上下面命令
`pkg-config --cflags --libs opencv`
注:命令的引号不是普通的引号,是ESC下面的按键
最后文件夹下的文件如下所示
运行main会弹出一张图片表示成功!!!
Gtk-WARNING **: cannot open display
如果运行不成功,报上面的错误表示你的系统没有安装图形显示界面
安装过程提供链接参考:图形界面的安装
本地环境测试OK!
可实际的项目生成的.so文件不可能在任何的服务器下安装本地需要的环境吧,所有调用.so文件也是处于一个无OpenCV环境的情况下进行调用。
从而在服务器上进行测试,具体步骤和上面雷同,这里就不在过多累述!
和上面不同的点本地环境是链接下载安装的环境,而服务器是不依赖与环境,但依赖各个OpenCV的.so库,所有需要将程序所需要的依赖库copy进服务器。
继而进行.so库的链接将so库加载进入共享文件中,设置方式进入/etc/ld.so.conf.d/目录下添加**.conf**文件,里面添加.so路径。
最后运行ldconfig
出现这种情况,表示系统链接不到这些库文件,但可以连接*.so.2.4.5文件,故把所有的*.so.2.4.5文件留下再试一次OK!
接着运行测试文件如下
这里表示不能识别*.so文件需要进行软链接才能辨认识别出,进入.so存放的文件夹运行命令
**sudo ln -s .so.3 .so 产生软链接
最后运行结果基本没有什么多大问题了,可以任服务器调用了。