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

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://xiahunao.cn/news/353850.html

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

相关文章

【Mysql】 表的增删查改

文章目录 【Mysql】表的增删查改Create --创建数据Retireve -- 读取数据select 列where条件order by -- 结果排序limit -- 分页 Update -- 更新数据Delete -- 删除数据deletetruncate -- 截断表 插入查询结果聚合函数group by 子句 【Mysql】表的增删查改 CRUD : Create(创建)…

Java开发手册中为什么不建议在for循环中使用“+“进行字符串操作

场景 java开发手册中对于循环体中进行字符串的拼接要求如下&#xff1a; 【推荐】循环体内&#xff0c;字符串的连接方式&#xff0c;使用 StringBuilder 的 append 方法进行扩展。 说明&#xff1a;下例中&#xff0c;反编译出的字节码文件显示每次循环都会 new 出一个 Str…

docker安装golang

最近玩 docker 比较多&#xff0c;试试安装 golang 操作系统&#xff1a;Linux 第一步 先看一下镜像&#xff1a; docker images 看一下我们目前的镜像中&#xff0c;是不是有go 如果有&#xff0c;版本不合适等&#xff0c;可以考虑删除&#xff0c;重新安装&#xff0c;也…

死亡空间2显卡测试软件,《激战2》官方显卡测试数据 A卡略胜N卡

在经过无数次测试后&#xff0c;《激战2》的开发人员从测试玩家处获得了无数的反馈和数据&#xff0c;今天ArenaNet针对硬件配置公布了相关数据&#xff0c;从数据中可以看到&#xff0c;在其他硬件不会成为瓶颈的情况下&#xff0c;AMD显卡帧数要比同等级Nvidia显卡略高&#…

linux运行激战2,在Deepin 20.1系统下可用Wine来模拟运行激战2游戏

经过实测并确定&#xff0c;在Deepin 20.1系统下可以用Wine来模拟运行激战2网络游戏&#xff0c;它的表现跟Windows下差不多&#xff0c;虽然是Wine&#xff0c;但这个游戏优化还是挺好的&#xff0c;我是核显玩的&#xff0c;帧数大概30左右吧&#xff0c;效果在预期之内。 效…

《从零开始的 RPG 游戏制作教程》第六期:设置怪物掉落物并部署关卡怪物

目录 1. 前言 2. 第一期&#xff1a;制作基础场景 3. 第二期&#xff1a;让勇者和怪物登场 4. 第三期&#xff1a;基础的数值设计 5.第四期&#xff1a;从理论的角度简单聊聊关卡 6.第五期&#xff1a;制作物品和技能 第六期&#xff1a;设置怪物掉落物并部署关卡怪物 …

五大移动GPU厂商

《谁能笑傲江湖&#xff1f;移动处理器门派那些事儿》一文中我们把2012年的移动处理器的厂商做了一番介绍&#xff0c;并按照各自的属性给划分了门派。既然把他们称为江湖门派&#xff0c;那么每一个门派总要有自己的绝活。移动处理器厂商中CPU基本都是源自ARM&#xff0c;同架…

趣谈网络协议-第二模块-底层网络知识详解:2最重要的传输层

趣谈网络协议-第二模块-底层网络知识详解:2最重要的传输层 1&#xff1a;第10讲 | UDP协议&#xff1a;因性善而简单&#xff0c;难免碰到“城会玩”TCP 和 UDP 有哪些区别&#xff1f;UDP 包头是什么样的&#xff1f;UDP 的三大特点第一&#xff0c;沟通简单第二&#xff0c;轻…

物联网-鸡舍项目总结

转自&#xff1a;http://mt.sohu.com/20160816/n464326503.shtml&#xff0c;在此向作者致敬&#xff0c;干货很多。 本系统采用五层架构&#xff1a;传感器/智能设备→采集器/智能终端→智能网关→云中间件/Web后台→网页/微信。 鸡舍一般需要监控的参数&#xff0c;包括光照、…

Python爬虫可视化第2季-舌尖上的“小龙虾”

前言&#xff1a; 上期内容与大家分享了一些旅游的内容&#xff0c;从本期开始&#xff0c;会陆续分享一些为吃货们量身定制的文章。世界杯激战正酣&#xff0c;大家在欣赏精彩比赛的同时&#xff0c;怎能少了美食的陪伴&#xff0c;我们今天就来聊聊世界杯的好丽友-小龙虾。 P…

华为的汽车“攻势”

数字化转型&#xff0c;对于传统汽车的从业者而言&#xff0c;看起来还是一个陌生的词汇。\n 然而&#xff0c;现实是&#xff0c;把汽车产品数字化&#xff0c;把企业运营数字化&#xff0c;把一切实体的东西数字化、虚拟化&#xff0c;将成为传统车企不得不直面的事关生死的…

三级pc技术_第十九周PC、笔电、数码周边新品汇总:AMD英特尔激战正酣

【dogkeji-科技犬】 各位网友周末好&#xff0c;又到了2020年第十九周的PC、笔电、数码周边新品发布汇总时刻&#xff08;2020年5月4日至2020年5月9日&#xff09;&#xff0c;那么本周有那些PC、笔电、数码周边新品发布呢&#xff1f;通过科技犬的汇总我们来一起回顾一下吧。 …

安全——网络安全协议的引入

TCP/IP安全缺陷 信息泄露 概述 网络中投递的报文往往包含账号、口令等敏感信息&#xff0c;若这些信息泄露则是灾难性的后果。其中嗅探是一种常见而隐蔽的网络攻击手段。 嗅探 概述 问题&#xff1a;在共享式网络架构下&#xff0c;所有的数据都是以广播方式进行发送&…

618价格激战下的苏宁悟空榜 映射零售进阶史

今年的电商价格战&#xff0c;给我的感觉是猛的一批。百亿补贴、J-10%、24期免息、直播低价促销、自有品牌产品降价不降质等等&#xff0c;一套价格组合拳打下来&#xff0c;让原本萎靡不振的消费市场又恢复到了以往的热闹烟火气息氛围中。 联想到8年之前的京东刘强东向苏宁发起…

汽车控制芯片赛道“激战”,高性能车规MCU全球首发

中国芯片厂商正在加速进入高端车载MCU&#xff08;微控制单元&#xff09;市场。 4月12日&#xff0c;芯驰科技重磅发布了ISO 26262 ASIL D级的高性能、高可靠、高安全、广覆盖的车规MCU产品——“控之芯”E3系列&#xff0c;该系列产品采用台积电22nm车规工艺&#xff0c;集成…

monkeyrunner2

最近,做android项目测试,测试一个应用程序在多个设备中分辨率是否合适,麻烦得要命,不停的截图比较,前一段时间,研究了一下monkeyrunner ,决定通宵写一个实用性强的monkeyrunner来方便测试使用 前一段时间写的monkeyrunner资料 http://youxilua.blog.51cto.com/3357586/772666 功…

梦三国解析服务器spl文件头失败,流沙恐遭降级?《梦三国2》MPL夏季赛第二轮激战全面开启...

逐梦巅峰&#xff0c;为荣耀而战&#xff01;2020《梦三国2》职业联赛(简称&#xff1a;MPL)夏季常规赛第一轮较量于上周正式结束&#xff0c;风月战队后来居上&#xff0c;通过6小局连胜将战队积分累积至14分&#xff0c;积分排名连跳3级成功登顶第四周积分榜首之位。常规赛半…

2017计算机最高配置,快来升级你的电脑:2017年单机大作配置要求一览

2017年&#xff0c;众多新游戏都蓄势待发&#xff0c;你的PC是否还能经受得住接连而来的游戏性能挑战呢&#xff1f;当然每个玩家所爱的游戏都是不一样的&#xff0c;所谓众口难调&#xff0c;并且各家厂商对游戏的优化程度也不尽相同&#xff0c;而且网游和单机对于硬件的要求…

对安装Linux的服务器进行缓存清除

安装Linux的服务器缓存过高导致服务器运行速度慢 第一步&#xff0c;查看当前服务器中Linux系统的状态。 命令&#xff1a;free -h 第二步&#xff1a;备份内存缓冲区中的数据到磁盘中。 命令&#xff1a;sync 在大多数情况下&#xff0c;不需要手动使用sync命令&#xff0…

英文的美好。。。

If You Could Choose If you had the power to decide what types of opportunities would come your way, what opportunities would you select? If you knew that your experiences would match your expectations, what would your expectations be?In fact, you do have…