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

news2024/12/21 2:04:24

Qt是跨平台工具,显然能和windows的动态库一起使用。

在Windows操作系统上,库以文件的形式存在,并且可以分为动态链接库(DLL) 和静态链接库两种。动态链接库文控以.dll为后缀名,静态链接库文控以.lib为后缀名。不管是动态链接库还是静态链接库,都是向它们的调用者提供变量、函数或举。

实质上,windows系统库主要以dll动态库为主,所以会在C:\Windows\System32下有大量的dll结尾的库文件。

⚠️windows下理论概念比较多适合萌新消化,大佬绕行!

 一、简述动态链接库

动态链接库的源码就是函数或类的具体实现,源码经过编译后会生成一个后缀名为dll的文件,这个文件就是动态链接库文件,是一个二进制形式的文件,不可以单独运行,必须和它的调用者一起运行。它通常可以向其调用者提供变量、函数或类

1、调用者(或称为使用者) 可以是应用程序 (exe程序) 或其他动态链接库;

2、提供给调用者调用的函数通常被称为导出函数;

3、提供给调用者使用的类通常被称为导出类。

动态链接库经过编译后会生成一个.lib文控和一个.dll文件,这里的.lib文件不是指静态链接库文件,而是导入库文文件,虽然后缀名和静态链接库文控相同,但是两者没有任何关系。

从调用来分,又有以下两种区别:

隐式链接:在程序执行的时候,就将DLL文件加载到应用程序中;

显式链接:应用程序在执行过程中随时可以添加DLL文件,也可以随时卸载DLL文件,这是隐式链接无法做到的,所以显示链接具有更好的灵活性,对于解释性言语更为合适。

.lib导入库文件中存放的是DLL文控中导出函数的名称和地址,应用程序采用隐式链接动态链接库时,会把导入库文控中的内容(导出函数或类的名称和地址) 复制到应用程序的代码中,当应用程序运行时,就能知道动态链接库中导出函数(或类) 的地址了。

 二、动态链接库dll的分类

简单的说把DLL分为非MFC DLL(又称Win 32 DLL)MFC DLL

非MFC DLL (Non-MFC DLL) 也称Win32 DLL,它指的是不用MFC的类库结构直接用C或者C++编写的DLL,其导出的函数是标准的C或者c++接口,能被非MFC或MFC编写的应用程序所调用。如果建立的DLL不需要使用MFC,那么应该建立Non-MFC DLL,因为使用MFC会增大用户库的大小,会浪费用户的磁盘和内存空间。

MFC DLL意味着可以在这种DLL的内部使用了微软的MFC库,这种情况不属于本文讨论范围之内;

三、动态链接库dll开发和调用

一个有用的DLL,首先要把DLL中的变量、函数或类导出,再编译生成dll文件。导出就是对那些要给外部程序使用的变量、函数或类进行声明。

通常有两种导出方式:

第一种方式是通过关键字 declspec(dllexport)导出;

另一种是采用模块定义文件.def导入文件(大部分情况下用的少不做演示);

无论采用哪种方法编译,最终都会生成dll文件和lib文件 (导入库文件)。

3.1 通过关键字 declspec(dllexport)导出

使用关键字 declspec(dllexport)可以从DLL导出数据、函数、类或类成员函数。这种方式比较简单,只要导出的内容前加 declspec(dllexport)即可。以下vs中演示第一种:

(1)、vs新建,动态链接库DLL;

 (2)、项目名称,勾选将解决方案和项目放在同一目录;

 (3)、默认会打开dllmain.cpp,直接关闭就行;

 (4)、项目,鼠标右键,添加,类;

(5)、输入类名;

 

(5)、AddDll.h和AddDll.cpp分别如下;

注意:其类型声明前面加上“__declspec (dllexport)”,为什么这里没有用到类,实测QLibrary调用的win32 dll必须是c语言,如果是C++必用qt自身创建dll。  

 

 

 

(6)、一般情况下最终都是需要Release版本都,我这里改Debug为Release,然后生成;

(7)、在项目Release目录下,找到我们需要动态链接库dll文件和lib文件 (导入库文件)

 3.2通过Qt调用dll

Qt调用DLL的导出函数有4种方法:

第一种是使用Win32 API:

第二种是使用Qt自身的API:

第三种是直接调用DLL:

第四种是Qt Creator可视化调用法,点点鼠标即可。

(1)、使用win32api

这种方法主要使用win32的api函数LoadLibrary(), 这种方法已经使用较少了,有兴趣的可参考下文;

(4条消息) 3.利用Win32 API调用DLL_api调用dll方法_深山里的小白羊的博客-CSDN博客icon-default.png?t=N4P3https://blog.csdn.net/qq_33757398/article/details/81564522

(2)、使用Qt自身的API函数QLibrary类

该方法是比较常用的一种,以下演示一下:

需要注意的是QLibrary:: resolve函数中,明确说明,该符号必须作为 C 函数从库中导出。

#include "mainwindow.h"

#include <QApplication>
#include <QLibrary>
#include <QDebug>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QLibrary lib;
    QString str1 = QApplication::applicationDirPath();
    qDebug()<<"str1="<<str1;
    QString str(str1+"/DllTest.dll" );
    lib.setFileName(str);
    if(lib.load())
    {
         typedef int(*AddFunction)(int a,int b);
         AddFunction Add = reinterpret_cast<AddFunction>(lib.resolve("MyAdd"));
         if(!Add)
         {
             qDebug()<<"resolve failed="<<lib.errorString();
         }
         else
         {
             int out=Add(1,3);
             qDebug()<<"out="<<out;
         }
    }
    else
    {
          qDebug()<<"load failed!";
    }

    MainWindow w;
    w.show();
    return a.exec();
}

 (3)、直接调用dll

这种情况下,最省事,但是它需要3个文件,一个lib,一个dll,还需要一个.h文件(源dll)

①将lib拷贝到qt的.pro目录下,如图所示;

 ②将dll复制到生成exe的坐在目录下;

 ③在qt的.pro文件中引用.lib,引用方式如下,-l你的lib文件名;

LIBS+=-L$$PWD/./ -lDllTest

前面表示绝对路径下的当前目录,仅需要修改后面lib名就行,比如你的lib是test123.lib,尾部应该是-ltest123,改完pro文件,记得按ctrl r让qt重新加载;

④添加源dll的头文件,原则上建议,新建一个与.lib同名的.h,这样可以防止编码等问题,如下图先项目右键,添加新文件,然后是C/C++ Header File,输入lib名字,最后将源dll里的头文件函数复制过来并且删除__declspec(dllexport);

 

 

 ⑤包含上一步新建的头文件,直接调用函数即可;

(4)、Qt Creator可视化调用法

这种方法与上面第三种类似,也是需要.dll和.lib、新建.h头文件,但是这种优势是,qt会自动解决.pro文件的修改。

可先进行这三步①②④,内容都是同第三种方法,把dll和.lib复制到对应位置,新建一个与.lib同名的.h文件并填充内容。

③这步稍微有些不同,如下图,项目右键,添加库,外部库,选择.lib路径后,qt自动解决引用和路径,这在目前看起来好像优势不大,但当你库文件多而杂时,它事半功倍。

 

 ⑤这一步其实也一样,包含头文件,直接调用即可;

 

本文重点还是讨论qt调用vc生成的dll,至于vc之间互相调用更加灵活,可参考以下文章

(4条消息) 在Qt和VS中使用动态链接库.dll文件----以隐式链接的方式_qt vs dll_咖啡与乌龙的博客-CSDN博客icon-default.png?t=N4P3https://blog.csdn.net/qq_40459977/article/details/125652187 原创不易,如有帮助,请多多关注,持续输出更多qt6相关内容!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/612232.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

独立站卖家如何应对PayPal风险?3大策略教你安全收款!

PayPal是全球风险控制做得最好的第三方在线支付平台&#xff0c;PayPal付款是钱直接到卖家PayPal账户。但随着外贸交易的日益发展&#xff0c;恶意买家的问题也越来越多。如何防范风险&#xff0c;保证收款安全&#xff0c;成为独立站卖家们所关注的问题。下面为大家分享三种策…

背包DP-入门篇

目录 01背包&#xff1a; 完全背包&#xff1a; 多重背包&#xff1a; 分组背包&#xff1a; 01背包&#xff1a; [NOIP2005 普及组] 采药 - 洛谷https://www.luogu.com.cn/problem/P1048 01背包背景 在一个小山上&#xff0c;有个n个黄金和一个容量为w的背包&#xff0c;…

【Python】深度理解Class类、Object类、Type元类的概念和关系

深度理解Class类、Object类、Type元类 1.Class类、Object类、Type元类的表面关系2.Class、Object、Type解释3.关系详解4.那么如何看待object、type在Python面对对象概念中的一席之地呢&#xff1f;5.那么object、type扮演了什么样的角色呢&#xff1f;他们对class又分别做了什么…

【计算机组成】Cache与CPU的直接映射、全相联映射与组相联映射

一.Cache与CPU需要映射的原因 CPU准备访问内存时&#xff0c;会先问问cache存储器有没有已经提前准备好了数据&#xff0c;如果没有则再找内存要&#xff1a; 如果Cache刚好命中&#xff0c;则直接从Cache中读取数据&#xff1a; 如果Cache没有命中&#xff08;Cache失效&#…

时序数据库InfluxDB快速入门使用

推荐博客&#xff1a; Influxdb中文文档 linux安装influxdb Influxdb安装、启动influxdb控制台、常用命令、Influx命令使用、Influx-sql使用举例、Influxdb的数据格式、Influxdb客户端工具 1.安装 1、influxdb数据库官网的下载链接&#xff1a; https://portal.influxdata.c…

如何利用MES系统进行生产防呆防错?

一、认识MES系统的防呆防错功能 首先&#xff0c;我们要清楚了解&#xff0c;什么是MES系统的防呆防错。MES系统防呆防错是指利用MES系统来避免生产过程中的错误和缺陷&#xff0c;保障生产排程和生产过程顺利进行的过程。MES系统防呆防错包括以下方面&#xff1a; 1. 自动识别…

relation-graph关系图谱组件2.0版本遇到的问题

前提&#xff1a;之前已经写过一篇1.1版本的问题&#xff0c;这里就不过多讲了&#xff08;如果想要解决火狐低版本兼容&#xff0c;看那个就行&#xff09; 这次主要讲的是和1.X版本的区别和一些其它问题 区别 参数名不同&#xff1a;以前的links>lines (虽然现在links也…

遇见未来,降低职场焦虑——中国人民大学与加拿大女王大学金融硕士来助力

身在职场的你有感到一丝丝的焦虑吗&#xff1f;偶尔的小焦虑可以作为我们工作中的动力&#xff0c;时刻提醒我们保持奋进。预见未来才能遇见未来&#xff0c;随着社会经济不断发展&#xff0c;没有什么是一成不变的。处于职场上升期的我们更要懂得未雨绸缪&#xff0c;增加自身…

ClickHouse集群搭建总结

简介 ClickHouse是俄罗斯最大的搜素引擎Yandex于2016年开源的列式数据库管理系统&#xff0c;使用C 语言编写, 主要应用于OLAP场景。 使用理由 在大数据量的情况下&#xff0c;能以很低的延迟返回查询结果。 笔者注&#xff1a; 在单机亿级数据量的场景下可以达到毫秒级的查询…

SpringCloudAlibaba 微服务生态

一 微服务架构 1.1 微服务 微服务其实是一种架构风格&#xff0c;我们在开发一个应用的时候这个应用应该是由一组小型服务组成&#xff0c;每个小型服务都运行在自己的进程内&#xff1b;小服务之间通过HTTP的方式进行互联互通。 1.2 微服务架构的常见问题 一旦采用微服务系…

ChatGPT 之后,B 端产品设计会迎来颠覆式革命吗?| Liga妙谈

近日&#xff0c;脑机接口公司 Neuralink 宣布&#xff0c;其植入式脑机接口设备首次人体临床研究已被准许启动。遥想当年&#xff0c;我们还嘲讽罗老师「动嘴做 PPT」&#xff0c;谁曾想不久后我们可能连嘴都不用动&#x1f64a;。 脑机接口何时会引爆人机交互革命尚未可知&a…

简述三观;

文章目录 三观世界观人生观价值观三观不合怎么看三观不正: 教养育儿教育心智不成熟的表现 三观 指人生观&#xff0c;世界观和价值观; https://wenku.baidu.com/view/102a655fd4bbfd0a79563c1ec5da50e2534dd1d8.html?fraladdin664466&ind1&_wkts_1685949448098&…

深入理解API网关Kong:动态负载均衡配置

深入理解API网关Kong&#xff1a;动态负载均衡配置 背景 在 NGINX 中&#xff0c;负载均衡的配置主要在 upstream 指令中进行。upstream 指令用于定义一个服务器群组和负载均衡方法。客户端请求在这个服务器群组中进行分发。 NGINX 提供了以下几种负载均衡方法&#xff1a; …

python接口自动化 —— 什么是接口、接口优势、类型(详解)

简介 经常听别人说接口测试&#xff0c;接口测试自动化&#xff0c;但是你对接口&#xff0c;有多少了解和认识&#xff0c;知道什么是接口吗&#xff1f;它是用来做什么的&#xff0c;测试时候要注意什么&#xff1f;坦白的说&#xff0c;笔者之前也不是很清楚。接下来先看一下…

从简历被拒到收割 8 个高薪 offer,我用了 3 个月...

半年前我一个小老弟从外包离职了&#xff0c;本以为有两年经验进个一般的公司没有问题的&#xff0c;结果人家一看是外包出来的&#xff0c;面试问的问题也不是很懂&#xff0c;简历被拒了好几次。还好这个小老弟没有气馁&#xff0c;在论坛博客和里面的大佬虚心学习&#xff0…

地震勘探基础(八)之地震动校正

地震动校正 在地震资料数字处理过程中&#xff0c;速度分析&#xff0c;动校正和水平叠加三个处理内容是相互关联的。水平叠加是为了提高地震资料的信噪比&#xff0c;要想得到好的叠加效果&#xff0c;必须做好动校正。而做好动校正&#xff0c;需要进行准确的速度分析。只有…

Tomcat部署

目录 Tomcat 什么是 servlet&#xff1f; 什么是 JSP? Tomcat 功能组件结构&#xff1a; Container 结构分析&#xff1a; Tomcat 请求过程&#xff1a; ---------------------Tomcat 服务部署------------------------- 1.关闭防火墙&#xff0c;将安装 Tomcat 所需软…

长尾词挖掘,长尾词的优化方法有哪些

我们都知道&#xff0c;长尾词能给我们带来较高的流量和转化率&#xff0c;且优化难度低&#xff0c;成本低。今天就来分享长尾词的优化方法。 首先需要挖掘长尾词&#xff0c;挖掘长尾词的方法以下3种比较实用&#xff1a; 1、使用长尾词挖掘工具 可以通过第三方工…

ROS:tf坐标系广播与监听的编程实现

目录 一、创建功能包二、创建代码并编译运行&#xff08;C&#xff09;2.1创建代码2.2编译2.3运行 一、创建功能包 创建的 learning_tf 包来进行代码存放和编译 cd ~/catkin_ws/src catkin_create_pkg learning_tf roscpp rospy tf turtlesim二、创建代码并编译运行&#xff…

银行业务相关

省联社&#xff0c;农商行、农村信用社之间的关系 一些知乎回答 省联社、农商行、农村信用社之间有什么联系&#xff1f; - mobye的回答 - 知乎 https://www.zhihu.com/question/24220844/answer/28276903 发源于空想社会主义&#xff0c;世界上第一个信用合作社诞生于1984年的…