首页 热点 业界 科技快讯 数码 电子消费 通信 前沿动态 企业前沿 电商

Qt调用动态库的三种方式(linux)

2023-08-03 07:57:34 来源 : 博客园


(资料图片仅供参考)

本文章主要记录Qt在linux电脑上调用so库的三种调用方式方式一:静态加载so库方式二:动态加载so库(QLibrary)方式三:动态加载so库(dlopen)其他:封装的so库叫做:libsoowCapture.so,这个so库又依赖了其他的so库,我是把所有的so库放在lib文件夹里面。库文件+目录结构如下图:

准备工作:

使用qtcreate,先创建一个基本项目,一个dialog窗口,窗口中有一个QPushButton按钮,点击按钮,调用库接口,弹窗显示结果。

方式一:静态加载so库

# pro文件LIBS += -Llib -lsoowCapture -lhv -lpthread -lImageProc -ljpeg -lcamapi# 项目添加现有文件,将 libsoowCapture.h 这个头文件加进来# dialog.cppvoid Dialog::test(){    char err[100];    soow_InitCameraLib(err);    long ret = soow_GetDevCount(err);    QMessageBox::information(this, "123", QString::number(ret));}

方式二:动态加载so库(QLibrary)

# dialog.cpp#include void Dialog::test(){    QLibrary mso("./lib/libsoowCapture.so");    if(mso.load())    {        QMessageBox::information(this, "123", "ok");    }    else    {        QMessageBox::information(this, "123", "no");    }    typedef long (*func1)(char*);    typedef long (*func2)(char*);    typedef long (*func3)(long, char*, char*);    func1 f1 = (func1)mso.resolve("soow_InitCameraLib");    func2 f2 = (func2)mso.resolve("soow_GetDevCount");    func3 f3 = (func3)mso.resolve("soow_GetDevName");    char err[100];    f1(err);    long ret =  f2(err);    QMessageBox::information(this, "123", QString::number(ret));    char name[100];    char err1[100];    long ret1 = f3(0, name, err1);    QMessageBox::information(this, "123", name);}
# 终端,在Qt编译后的文件夹中打开终端// 1.设置临时环境变量export LD_LIBRARY_PATH=lib// 2.运行编译出的程序./untitled

运行结果可以见 方式三 下面的截图

方式三:动态加载so库(dlopen)

# pro 文件LIBS += -ldl# dialog.cpp#include void Dialog::test(){    void* handle = dlopen("./lib/libsoowCapture.so", RTLD_NOW);    if(handle)    {        QMessageBox::information(this, "123", "ok");    }    else    {        QMessageBox::information(this, "123", "no");    }    typedef long (*func1)(char*);    typedef long (*func2)(char*);    typedef long (*func3)(long, char*, char*);    func1 f1 = (func1)dlsym(handle, "soow_InitCameraLib");    func2 f2 = (func2)dlsym(handle, "soow_GetDevCount");    func3 f3 = (func3)dlsym(handle,"soow_GetDevName");    char err[100];    f1(err);    long ret =  f2(err);    QMessageBox::information(this, "123", QString::number(ret));    char name[100];    char err1[100];    long ret1 = f3(0, name, err1);    QMessageBox::information(this, "123", name);}
# 终端,在Qt编译后的文件夹中打开终端// 1.设置临时环境变量export LD_LIBRARY_PATH=lib// 2.运行编译出的程序./untitled

标签:

相关文章

最近更新
哪吒汽车,陷入两难 2023-08-03 07:17:18
蔡迅(关于蔡迅简述) 2023-08-03 07:00:37