Linux 下生成动态链接库并调用(.so)项目实例

Linux 下生成动态链接库并调用(.so)项目实例

[查看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文件

如果出现如下问题
Linux 下生成动态链接库并调用(.so)项目实例_第1张图片
表示没有链接到本地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

Linux 下生成动态链接库并调用(.so)项目实例_第2张图片
出现这种情况,表示系统链接不到这些库文件,但可以连接*.so.2.4.5文件,故把所有的*.so.2.4.5文件留下再试一次OK!
在这里插入图片描述
接着运行测试文件如下
Linux 下生成动态链接库并调用(.so)项目实例_第3张图片
这里表示不能识别*.so文件需要进行软链接才能辨认识别出,进入.so存放的文件夹运行命令

**sudo ln -s .so.3 .so 产生软链接

最后运行结果基本没有什么多大问题了,可以任服务器调用了。

你可能感兴趣的:(动态链接库)