QT 链接动态库 (静态链接 条件编译 动态加载)

这篇具有很好参考价值的文章主要介绍了QT 链接动态库 (静态链接 条件编译 动态加载)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


本篇文章以我实际使用过程为例,在此总结一下qt链接动态库的几种方式
使用的动态库为libzint.so,库目录为/usr/local/lib

静态链接

第一种为直接将库添加到QT中,可以看成静态库

通过pro文件添加链接

//demo.pro

LIBS += -L/usr/local/lib/ -lzint


在用到外部库的程序代码中直接

//mainwindow.cpp

#include <zint.h>

这样就可以直接调用外部库的中结构体与函数接口

//mainwindow.cpp

//图片存储路径
QString strImagePath = QCoreApplication::applicationDirPath() + "/barcode.bmp";

//设置生成属性,可根据需要自行修改
struct zint_symbol * my_symbol = ZBarcode_Create(); //外部接口与外部结构体,直接调用就可以
my_symbol->symbology=BARCODE_QRCODE;
strcpy(my_symbol->outfile, strImagePath.toStdString().c_str());
qDebug()<<my_symbol->outfile<<endl;


QString b="1\n2\n行";
//完成二维码制作并保存
ZBarcode_Encode(my_symbol,(unsigned char*)b.toStdString().c_str(),0); //外部接口
ZBarcode_Print(my_symbol,0);    //外部接口
ZBarcode_Delete(my_symbol);     //外部接口

//在label上显示二维码图片
QImage img;
img.load(strImagePath.toStdString().c_str());
QImage newImg = img.scaled(ui->label->width(),ui->label->height(), Qt::IgnoreAspectRatio);
ui->label->setPixmap(QPixmap::fromImage(newImg));

可以直接使用外部库,直接调用包含的结构体与函数接口

这种方法最简单方便,但是限制条件也最多
编译与运行都需要有对应的外部库文件

但是实际应用中,一套代码对应多个版本,而库的使用也不尽相同,那么每当我用不到一个库的时候,我需要删除所有与此相关的代码,这无疑是项十分繁琐浪费资源的事情。
那么下面我们来看条件编译。
 

静态链接(条件编译)

既然我要控制库的使用与否,那我在静态链接的情况下,我必须从头控制,即在pro文件中,编译时是否链接外部库的时候进行控制。

//demo.pro


DEFINES += USE_ZINT
USE_ZINT{
    message('USE ZINT')
    LIBS+=-L/usr/local/lib -lzint

}else{
    message('NO USE ZINT')

}
//mainwindow.cpp

#ifdef USE_ZINT
    #include <zint.h>
#endif
//mainwindow.cpp

#ifdef USE_ZINT

//图片存储路径
QString strImagePath = QCoreApplication::applicationDirPath() + "/barcode.bmp";

//设置生成属性,可根据需要自行修改
struct zint_symbol * my_symbol = ZBarcode_Create(); //外部接口与外部结构体
my_symbol->symbology=BARCODE_QRCODE;
strcpy(my_symbol->outfile, strImagePath.toStdString().c_str());
qDebug()<<my_symbol->outfile<<endl;


QString b="1\n2\n行";
//完成二维码制作并保存
ZBarcode_Encode(my_symbol,(unsigned char*)b.toStdString().c_str(),0); //外部接口
ZBarcode_Print(my_symbol,0);    //外部接口
ZBarcode_Delete(my_symbol);     //外部接口

//在label上显示二维码图片
QImage img;
img.load(strImagePath.toStdString().c_str());
QImage newImg = img.scaled(ui->label->width(),ui->label->height(), Qt::IgnoreAspectRatio);
ui->label->setPixmap(QPixmap::fromImage(newImg));
#endif
//这种方法可以方便的设置,使用与否此库
DEFINES += USE_ZINT //使用此库,定义USE_ZINT

#DEFINES += USE_ZINT //不使用此库,#注释掉,则后面不执行ifdef中的语句

通过一行代码可以控制程序实现两个版本,使用该库,不使用该库。
相较于纯静态链接,更加的灵活的实现控制,不用再去一行行的删除代码。

上述的两种的静态链接,都需要在编译和运行时,具有库的环境。
编译时需要找到库读取头文件,运行时也需要找到库读取头文件。
对于多人协作完成项目,会更加的繁琐,因为需要每个人都拥有每个库的编译环境,才能完整的编译完成整个程序

这时候就体现出动态加载的优点了,编译时不必需要库的环境,只有运行时需要。
 

动态加载

动态加载的编写更加繁琐,也借助了QLibrary才能实现
因为编译过程不需要库环境,所以不用修改pro文件,直接修改需要该库的程序文件

QLibrary使用过程简单来说就是先加载动态库文件,然后读取外部动态库接口。
调用load()来加载动态库文件,resolve()用于解析库中的符号,读取函数接口。

首先添加

//mainwindow.cpp

#include <QLibrary>

那么接下来我们就可以通过QLibrary来使用外部库了

//mainwindow.cpp

//定义程序中的承载函数
typedef zint_symbol *(*Zint_Create)();
typedef void (*Zint_Delete)(struct zint_symbol *symbol);
typedef int (*Zint_Encode)(struct zint_symbol *symbol, const unsigned char *source, int length);
typedef int (*Zint_Print)(struct zint_symbol *symbol, int rotate_angle);

//加载动态库
 QLibrary* mainFunDll = new QLibrary("/usr/local/lib/libzint.so.2.11");

    if (mainFunDll->load()) //若加载成功,则启用二维码
    {
         qDebug()<<"-------启用zint二维码库------"<<endl;
         QString strImagePath = QCoreApplication::applicationDirPath() + "/barcode.bmp";

         //读取外部动态库接口
         Zint_Create creat=(Zint_Create)mainFunDll->resolve("ZBarcode_Create");
         Zint_Encode encode=(Zint_Encode)mainFunDll->resolve("ZBarcode_Encode");
         Zint_Print print=(Zint_Print)mainFunDll->resolve("ZBarcode_Print");
         Zint_Delete Delete=(Zint_Delete)mainFunDll->resolve("ZBarcode_Delete");

         struct zint_symbol * my_symbol = (zint_symbol *)creat();
         my_symbol->symbology=BARCODE_QRCODE;
         strcpy(my_symbol->outfile, strImagePath.toStdString().c_str());

         QString b="1\n2\n行";
         

         //生成二维码
         encode(my_symbol,(unsigned char*)b.toStdString().c_str(),0);
         print(my_symbol,0);
         Delete(my_symbol);



         //在label上显示二维码图片
         QImage img;
         img.load(strImagePath.toStdString().c_str());
         QImage newImg = img.scaled(ui->label_QR->width(),ui->label_QR->height(), Qt::IgnoreAspectRatio);
         ui->label_QR->setPixmap(QPixmap::fromImage(newImg));

    }
    else  //加载失败则不启用
    {
        qDebug()<<"-------不启用zint二维码库------"<<endl;
        ui->label_QR->clear();

    }

当程序运行时,会尝试加载动态库,加载成功就运行,失败则不运行。
这样的话可以实现一版程序,多种运行结果,是最灵活的链接方式文章来源地址https://www.toymoban.com/news/detail-809438.html

到了这里,关于QT 链接动态库 (静态链接 条件编译 动态加载)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • Linux gcc/g++编译链接头文件和库(动态库.so 和 静态库.a)

    Linux gcc/g++编译链接头文件和库(动态库.so 和 静态库.a)

    最近在学习log4cpp库时,使用g++去编译,却发现自己不会链接...,这哪能行,于是网上钻研,终于解决,现在记录下来分享给遇到同样问题的人。 gcc和g++类似,这里就以g++为例! 刚好用到的log4cpp日志库有头文件和动态库.so和静态库.a,这里就以log4cpp库为例。 在安装好log4cpp库

    2024年02月08日
    浏览(12)
  • Qt 中动态加载窗口(C++)

    Qt 中动态加载窗口(C++)

    在编程中,我经常会遇见要根据用户触发按钮,动态生成窗口的情况。在此有两种方法可以动态生成窗口:一:直接在槽函数中调用窗口类。二:将 **.ui 添加到资源文件,通过 QUiLoader 加载。 现将两种方法介绍如下。 在 Qt 中创建 Qt 设计师界面类 一: 1)在函数中实例化窗体

    2024年02月11日
    浏览(7)
  • 麒麟-飞腾Kylin-V4桌面arm64系统静态编译QT

    麒麟-飞腾Kylin-V4桌面arm64系统静态编译QT

    1.系统具体版本:   2. 因为此版本的源很老了,需要修改版本的源,才能正常更新各种软件,否则,你连麒麟商店都打不开。 选择你系统对应版本的源地址:  改完后:   然后重启电脑。 3.编译QT源码: 在编译之前,因为qt会用到openssl。我们要确定openssl的版本: 输入   

    2024年02月16日
    浏览(17)
  • Qt Visual Studio添加Qt ui和编译注意事项

    Qt Visual Studio添加Qt ui和编译注意事项

    工程中需要新的界面 VS中新建Qt的ui文件,然后需要生成对应的.cpp 和 .h 文件 生成对应的三个文件.ui, xxx. cpp, xxx.h 但是此时在QtWidgetsTestClass.h 里面,包含了#include “ui_QtWidgetsTestClass.h”。 会提示找不到该文件。该文件的生成,需要使用到Qt的uic.exe程序 1.通过配置ui_QtWidgetsTest

    2024年02月02日
    浏览(15)
  • Qt、C++动态UI

    Qt、C++动态UI

    在项目实践中,最简单的更新应用UI交互的方式就是更新整个安装包。 随着业务的发展,一个客户端需要同时适配多种业务,每种业务都有自己独特的设置页,业务之间又较为独立。如果将这些UI页面、业务代码都在一份代码上维护,加各种条件分支,维护会越来越困难:容

    2024年02月03日
    浏览(9)
  • Qt6之调用Windows下vc生成的动态链接库dll

    Qt6之调用Windows下vc生成的动态链接库dll

    Qt是跨平台工具,显然能和windows的动态库一起使用。 在Windows操作系统上,库以文件的形式存在,并且可以分为动态链接库(DLL) 和静态链接库两种。动态链接库文控以.dll为后缀名,静态链接库文控以.lib为后缀名。不管是动态链接库还是静态链接库,都是向它们的调用者提供变

    2024年02月09日
    浏览(13)
  • 【Qt】无法定位程序输入点xxx于动态链接库libstdc++-6.dll等

    在使用Qt编译出来exe文件之后会提示这个错误,错误的原因在于没有指定合适的链接库。可以使用在“我的电脑”全局搜索一下,可以看到有很多个libstdc+±6.dll ,查看对应路径是否在环境变量path中,应该有多个都在path环境变量下。这个问题可以通用于libstdc+±6.dll、libgcc_s_d

    2024年02月15日
    浏览(11)
  • PyQt5学习笔记--加载Qt Designer设计的ui文件

    PyQt5学习笔记--加载Qt Designer设计的ui文件

    目录 1--直接加载ui文件 2--动态加载ui文件及其属性 3--绑定槽函数测试 4--登录程序实例练习 ① Qt Designer 下载地址​​​​​ ② 设计ui并保存导出   ③ 直接加载代码 ​ ① 在Qt Designer设计ui文件:   ② 源程序: ③ 结果测试  

    2024年02月10日
    浏览(26)
  • RT-Thread开发,使用SCons编译,生成静态库,并进行链接生成MCU程序

            SCons 是一个开放源代码、以 Python 语言编写的下一代的程序建造工具。它最初的名字是 ScCons, 基于由 perl 语言编写的 Cons 软件开发而成,它在 2000 年 8 月获得了由 Software Carpentry 举办的 SC 建造比赛的大奖。现在 ScCons 已经被改名为 SCons,目的是为了表示不再与 Sof

    2024年02月11日
    浏览(9)
  • 在 Visual Studio 中编译 Qt 资源文件和 UI 文件教程

    Qt 是一个跨平台的 C++ 库,用于开发图形界面和应用程序。在 Qt 开发中,资源文件和 UI 文件是常见的两种资源,需要将它们编译成可用的形式,以便在应用程序中使用。本教程将指导您如何在 Visual Studio 中配置并编译 Qt 资源文件和 UI 文件。 安装 Qt 开发工具包:确保您已经

    2024年02月12日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包