本文章主要记录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. macOS Monterey 与以下电脑兼容下载操作流程解析

    有时在开发iOS应用时我们时常遇到各种情况,比如手机升级了Xcode不支持这时候需要安装xcode但是xcode需要依奈相应系统本人小编整理了这种情况无法解决问题. 首相打开苹果标志进入到下面界面 进 ...

  2. 【Azure 应用服务】Azure Function App在部署时候遇见 503 ServiceUnavailable

    问题描述 在VS Code中编写好 Azure Function App代码后,通过  func azure functionapp publish 部署失败,抛出 503 Service Unava ...

  3. 『Echarts』基本使用

    一.前言 本篇文章是『Echarts』文章的第 2 篇,主要介绍『Echarts』基本使用 在『Echarts』第 1 篇文章中,我们介绍了 Echarts 的概述及其强大的数据可视化功能.本篇将继续 ...

  4. Java运行时生成类元数据,初始化注解信息的方式

    问题前因 在一次技术升级中, 把分布式配置中心组件由百度的Disconf 改成 Nacos , 在对项目进行改造时, 首先将所有Disconf客户端依赖全部移除后, 依赖的封装的jar包中, 所有依赖 ...

  5. Java 类的内部成员之五:内部类

    1 package com.bytezreo.innerclass; 2 3 /** 4 * 5 * @Description 类的内部成员之五:内部类 6 * @author Bytezero·zh ...

  6. redis分片sharding实现原理

    为什么集群? 通常,为了提高网站响应速度,总是把热点数据保存在内存中而不是直接从后端数据库中读取.Redis是一个很好的Cache工具.大型网站应用,热点数据量往往巨大,几十G上百G是很正常的事儿,在 ...

  7. k8s实战之MySQL单实例部署

    前面我们学习了k8s入门系列文章,了解了k8s的一些基础概念以及怎么使用.本篇文章将进行一个小小的实战,使用k8s来部署单机版的mysql数据库,基本涵盖到前面讲到的Namespace.Pod.Dep ...

  8. HttpClientHandler VS SocketsHttpHandler

    .NET Framework 和 .NET Core 2.0 及更低版本中由 HttpClient 使用的默认消息处理程序为HttpClientHandler. 从 .NET Core 2.1 开始, ...

  9. python中数字和字符串和bytes的相互转换实例解析

    一 数字和字符串的相互转换 # int convert string str(12345)) #string convert int int('12345') 二 数字和bytes的相互转换 1.数字 ...

  10. HDU 2056:Rectangles(两个矩形交点的性质)

    一.原题链接 Problem - 2056 (hdu.edu.cn) 二.题面 Given two rectangles and the coordinates of two points on th ...