首页 > 系统相关 >Qt调用动态库的三种方式(linux)

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

时间:2023-08-01 14:59:00浏览次数:31  
标签:调用 Qt err long char 123 so QMessageBox linux

 

本文章主要记录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,err,long,char,123,so,QMessageBox,linux
From: https://www.cnblogs.com/shiyixirui/p/17596473.html

相关文章

  • Linux systemd配置
    介绍:systemd是Linux系统工具,用来启动守护进程,已成为大多数发行版的标准配置。它是一个初始化程序(init)和SystemV初始化脚本的现代替代者。Systemd可以接管后台服务、结束、状态查询,以及日志归档、设备管理、电源管理、定时任务等许多职责。Systemd是所有进程之母,负责将Linux主......
  • iTOP-i.MX6ULL开发板Qt 串口编程
    本章内容对应视频讲解链接(在线观看):QT上位机开发之串口助手(上)→B站搜索标题→【北京迅为】嵌入式学习之QT学习篇QT上位机开发之串口助手(下)→B站搜索标题→【北京迅为】嵌入式学习之QT学习篇本节我们使用Qt来编写一个简单的上位机。实验介绍:组装ui界面,使用Qt提供的串口类......
  • 《dll篇》c#调用c++dll
    c#调用c++dll参考链接:https://jingyan.baidu.com/article/5d6edee2da72d699eadeecfe.html生成dll环境:VS2008新建项目->VisualC++->Win32项目MyDLL注意:C++编写的dll一般是不能直接拿来C#调用,需要先新建个C++的工程把dll里的方法重新封装成可被C#外部调用的函数。MyDLL.cp......
  • Linux 编译 libjpeg-9e
     jpeg的库有两个:一个是官方的libjpeg 还有一个是libjpeg-turboJPEG库(libjpeg-turbo):https://libjpeg-turbo.org/Libjpeg库:http://www.ijg.org/ *:我用的是官方的libjpeg,进入官网下载的时候,要注意zip的这个包是Windows的,tar.gz的这个包才是linux的 ./configure-h......
  • [转]Linux密码保存文件及各位置参数含义
    原文地址:linux哪个目录存放密码-睿象云平台“/etc”目录用来存放系统主要的配置文件,例如用户的账号密码等文件,有两个存放密码的文件:1、shadow文件,用于存储系统中用户的密码信息;2、gshadow文件,用于存储系统中组用户的密码信息。本教程操作环境:linux5.9.8系统、DellG3电脑。lin......
  • Linux常用耗资源命令汇总
    在Linux中,以下命令可能在处理大量数据或复杂操作时比较消耗资源。一般来说,涉及大量数据处理、计算或者I/O操作的命令会比较耗费系统资源。​注意:所有命令资源消耗都是相对的,基于文件的处理量来展现find命令通常会比较消耗资源,因为它需要遍历整个文件系统来查找文件......
  • linux sbatch 提交jupyter
    点击查看代码#!/bin/bash#SBATCH-pBatch2#SBATCH-N1#SBATCH-n1#SBATCH-c1#SBATCH--job-name=jupyter#SBATCH--output=jupy.out#SBATCH--error=jupy.err#SBATCH--parsableport=8003ip=`ifconfig|grep-m1inet|awk'{print$2}'`jup......
  • Qt-day02
     调用重载的信号  #ifndefMAINWIDGET_H#defineMAINWIDGET_H#include<QWidget>#include<QPushButton>#include<QDebug>#include"subwidget.h"classMainWidget:publicQWidget{Q_OBJECTpublic:MainWidget(QWidget*par......
  • 导入mysql 乱码问题及 Linux 中的文件格式转换
    问题下载了一个单词sql文件,导入mysql报错,查看文件类型:%fileenglish_word.sqlenglish_word.sql:Non-ISOextended-ASCIItext与另一个导入成功的文件对比,发现格式不一样:%fileenglish-root.sqlenglish-root.sql:UTF-8Unicodetext,withverylonglines,withnoli......
  • 如何用手机使用 Termux 安装 Kali Linux
    termux是手机上的一款终端模拟器,可以在手机无root的情况下在手机中安装多款linux,目前网上的主流主要有两种方法,将分别讲解,这里使用kali系统为例。Termux下载地址:https://f-droid.org/packages/com.termux/1.在termux里运行`termux-setup-storage`获取手机存储的读写权限2.修......