本文章主要记录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.cpp
void 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 <QLibrary>
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 <dlfcn.h>
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

Qt调用动态库的三种方式(linux)的更多相关文章

  1. 调用sed命令的三种方式

    调用sed命令的三种方式 调用sed有三种方式,一种为Shell命令行方式,另外两种是将sed命令写入脚本文件,然后执行该脚本文件. 三种方式的命令格式归纳如下: 一.在Shell命令行输入命令调用s ...

  2. Android 接入 OpenCV库的三种方式

           OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux.Windows.Android和Mac OS操作系统上.它轻量级而且高效——由一系列 C 函数和少 ...

  3. 加载gif动态图的三种方式

    准备:本地图片资源,GifView

  4. jquery调用click事件的三种方式

    第一种方式: $(document).ready(function(){ $("#clickme").click(function(){ alert("Hello Wor ...

  5. C#调用C++ DLL动态库的两种方式

    第一种方式:C++导出函数, c#dllimport 的方式 在很多地方都看到过,如[dllimport "user32.dll"]这种代码,调用windows API,就是通过这 ...

  6. QT 调用 DLL 方法(三种方法)

    Qt调用DLL方法一:使用Win32 API 在显式链接下,应用程序必须进行函数 调用以在运行时显式加载 DLL.为显式链接到 DLL,应用程序必须:? 调用 LoadLibrary(或相似的函 数) ...

  7. 办公室的远程传文件 的命令三种方式linux

    不同的Linux之间copy文件常用有3种方法: 第一种就是ftp,也就是其中一台Linux安装ftp Server,这样可以另外一台使用ftp的client程序来进行文件的copy. 第二种方法就是 ...

  8. java:struts框架2(方法的动态和静态调用,获取Servlet API三种方式(推荐IOC(控制反转)),拦截器,静态代理和动态代理(Spring AOP))

    1.方法的静态和动态调用: struts.xml: <?xml version="1.0" encoding="UTF-8"?> <!DOCT ...

  9. Struts2方法调用的三种方式

    在Struts2中方法调用概括起来主要有三种形式 第一种方式:指定method属性 <action name="student" class="com.itmyho ...

  10. Struts2方法调用的三种方式(有新的!调用方法的说明)

    在Struts2中方法调用概括起来主要有三种形式 第一种方式:指定method属性 <action name="heroAction" class="com.ABC ...

随机推荐

  1. 【Azure Key Vault】在Alteryx中使用Azure Key Vault存储账号和密码并实现无交互登录

    问题描述: 需要在Alteryx中使用Azure Key Vault, Alteryx 能将数据发布到 Tableau,需要输入账号和密码,使用Azure Key Vault来替换这个输入账号和密码的 ...

  2. 【Azure 应用服务】App Service For Linux 环境中,如何修改 Nginx 配置中 server_name的默认值 example.com

    问题描述 在App Service for Linux环境中,部署PHP应用,使用Nginx服务器.因为PHP应用中所有静态资源的URL使用的默认域名为 https://example.com:808 ...

  3. 【Azure Developer】解答《美丽的数学》一书中P120页的一道谜题:寻找第四个阶乘和数

    一道谜题 在观看<美丽的数学>一书中,在120页中有一道谜题: 数字145被称为一个阶乘和数, 因为它具有以下有趣的属性,如果我们将它的各位数字的阶乘相加,会得到该数字本身 1! +4! ...

  4. 手把手教你用 NebulaGraph AI 全家桶跑图算法

    前段时间 NebulaGraph 3.5.0 发布,@whitewum 吴老师建议我把前段时间 NebulaGraph 社区里开启的新项目 ng_ai 公开给大家. 所以,就有了这个系列文章,本文是该 ...

  5. 16. Class字节码结构

    1. 相关概念 1.1字节码文件的跨平台性 Java 语言是跨平台的(write once, run anywhere) 当 Java 源代码成功编译成字节码后,如果想在不同的平台上面运行, 则无须再 ...

  6. tmux使用--同步多终端输入

    最近一直需要同时操作多个远程机器,就简单学习了下tmux的使用.tmux(terminal multiplexer)是终端复用神器.对多个窗格同时使用特别好用,同步操作多台机器特别方便. tmux安装 ...

  7. Idea编译/运行Java程序慢

    修改前: 修改后: 参考: https://www.jjput.com/archives/macbookpro14m1mavenslowcompilation 问题 JDK尽量不要换版本 class ...

  8. 使用ScottPlot库在.NET WinForms中快速实现大型数据集的交互式显示

    前言 在.NET应用开发中数据集的交互式显示是一个非常常见的功能,如需要创建折线图.柱状图.饼图.散点图等不同类型的图表将数据呈现出来,帮助人们更好地理解数据.发现规律,并支持决策和沟通.本文我们将一 ...

  9. webserver总结

    可设置参数:连接池最大连接数,最大线程数,任务队列最大值,timeslot epoll epoll监听listen_fd(接受新客户端和断开连接), pipefd(将信号输入到管道用epoll统一管理 ...

  10. 走进volatile的世界,探索它与可见性,有序性,原子性之间的爱恨情仇!

    写在开头 在之前的几篇博文中,我们都提到了 volatile 关键字,这个单词中文释义为:不稳定的,易挥发的,在Java中代表变量修饰符,用来修饰会被不同线程访问和修改的变量,对于方法,代码块,方法参 ...