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

这篇具有很好参考价值的文章主要介绍了Qt6之调用Windows下vc生成的动态链接库dll。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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

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

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

qt调用dll库文件,Qt6,windows,qt,开发语言

 一、简述动态链接库

动态链接库的源码就是函数或类的具体实现,源码经过编译后会生成一个后缀名为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;

qt调用dll库文件,Qt6,windows,qt,开发语言

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

qt调用dll库文件,Qt6,windows,qt,开发语言

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

qt调用dll库文件,Qt6,windows,qt,开发语言

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

qt调用dll库文件,Qt6,windows,qt,开发语言

(5)、输入类名;

qt调用dll库文件,Qt6,windows,qt,开发语言

 

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

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

qt调用dll库文件,Qt6,windows,qt,开发语言

 qt调用dll库文件,Qt6,windows,qt,开发语言

 

 

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

qt调用dll库文件,Qt6,windows,qt,开发语言qt调用dll库文件,Qt6,windows,qt,开发语言

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

qt调用dll库文件,Qt6,windows,qt,开发语言

 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博客https://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();
}

qt调用dll库文件,Qt6,windows,qt,开发语言

 (3)、直接调用dll

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

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

qt调用dll库文件,Qt6,windows,qt,开发语言

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

qt调用dll库文件,Qt6,windows,qt,开发语言

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

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

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

qt调用dll库文件,Qt6,windows,qt,开发语言

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

qt调用dll库文件,Qt6,windows,qt,开发语言

 

qt调用dll库文件,Qt6,windows,qt,开发语言

 qt调用dll库文件,Qt6,windows,qt,开发语言

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

qt调用dll库文件,Qt6,windows,qt,开发语言

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

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

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

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

qt调用dll库文件,Qt6,windows,qt,开发语言qt调用dll库文件,Qt6,windows,qt,开发语言

qt调用dll库文件,Qt6,windows,qt,开发语言

 qt调用dll库文件,Qt6,windows,qt,开发语言

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

qt调用dll库文件,Qt6,windows,qt,开发语言 

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

(4条消息) 在Qt和VS中使用动态链接库.dll文件----以隐式链接的方式_qt vs dll_咖啡与乌龙的博客-CSDN博客https://blog.csdn.net/qq_40459977/article/details/125652187 原创不易,如有帮助,请多多关注,持续输出更多qt6相关内容!文章来源地址https://www.toymoban.com/news/detail-698331.html

到了这里,关于Qt6之调用Windows下vc生成的动态链接库dll的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • LabVIEW调用动态链接库DLL

    LabVIEW调用动态链接库DLL 要调用DLL,首先必须确定该库是C/ C ++ DLL还是Microsoft .NET Assembly / .NET DLL。 若要确定具有哪种类型的库,可以检查DLL文件的可移植可执行(PE)标头。 DLL 是 C/ C ++ DLL : 1.       如果没有头文件,请查找头文件(* .h)或函数原型定义,请跳

    2024年02月03日
    浏览(27)
  • Java JNA调用dll动态链接库

    记录学习内容 C编译dll环境:         IDE:Clion         ToolChains:MinGW64 Java环境:         版本:jdk1.8 64位         JNA依赖版本:5.2.0 (可根据需要升级,本文以此版本为例) JNA(Java Native Access )提供一组Java工具类用于在运行期间动态访问系统本地库(native library:如W

    2024年02月12日
    浏览(28)
  • Rust:使用libloader调用动态链接库 (DLL)

    掘金为同人创作:掘金 最近需要使用Rust 动态调用 动态链接库,本来打算是使用 libloading 的,但是 libloading 在调用dll中的函数的时,是必须要在编译时确定参数和return的类型的。但后来发现了 libloader 这个包包, libloader 是基于 libloading 的,但是操作起来却比 libloader 方便。

    2023年04月10日
    浏览(36)
  • 前端(node.js)调用dll动态链接库

    使用 js node 调用dll 动态链接库. github地址如下,包含dll,里面就一个Add方法暴露出来 github Windows 11 22H2 node v16.20.0 Python 3.11.2 需要安装这俩库 ffi-napi app.js 第一种不好使,曲线救国的方式这个是。 python-shell app.js python

    2024年02月16日
    浏览(31)
  • Unity——在C#中调用C++动态链接库(DLL)

    1、新建C++空项目 打开VS,新建一个C++空项目,自命名项目名称与位置。 2、配置项目属性为动态链接库 右键项目,点击属性,打开项目属性页,将常规中的配置类型改为动态库(.dll)。  3、添加.h头文件 右键头文件,点击添加—新建项,选择头文件.h,命名为DllForUnity.h,点击

    2024年02月10日
    浏览(28)
  • Python 使用 ctypes 调用 C/C++ DLL 动态链接库

    ctypes 有以下优点: Python内建,不需要单独安装 Python可以直接调用C/C++ 动态链接库(.dll 或 .so) 在Python一侧,不需要了解 c/c++ dll 内部的工作方式 提供了 C/C++ 数据类型与Python类型的相互映射,以及转换,包括指针类型。 ctypes 在下列场景可以发挥较大作用 运算量大的操作可以写

    2024年02月06日
    浏览(34)
  • Qt动态调用(外部调用)SDK库(dll动态库)

    ​​​​​​​  之前的文章,介绍了Qt调用sdk库的方式,大家可以点击查看(Q调用SDK库(dll动态库))之前的文章,里面介绍的调用方式就是静态的调用方式。如下图所示,需要提供.h文件,dll文件和lib文件。  本篇文章主要实现通过一个dll文件,外部动态调用的方式来调用我

    2024年02月09日
    浏览(29)
  • [速成] Visual Studio C/C++创建Dll(动态链接库)并调用

    以下示例均在VS2022环境下完成。 注意: _EXPORTING 是笔者 自定义宏 ,用于区分当前是导出dll还是调用dll,要实现导出函数,还需要在实现Dll函数功能的 项目属性 里,添加 预处理定义 (记得结尾加 分号 ),如下图: _declspec(dllexport) 是VC的,表示 导出函数 到dll; _declspec(dllim

    2024年02月04日
    浏览(34)
  • VS2022环境下C++ DLL动态链接库的编写和调用

    1、新建动态链接库项目 2、新建类 3、宏定义 4、使用宏定义修饰类 调用DLL动态链接库大致有两种方法: 一种是“隐式调用”,需要.h头文件、.lib符号文件、.dll动态库文件; 一种是“显示调用”,需要.dll动态库文件; 此处介绍第一种调用方式。 1、创建项目 2、项目属性

    2024年02月14日
    浏览(35)
  • VS2019编译生成动态链接库dll的两种方式

     dll项目的默认结构如下:  四个文件的内容因为是默认生成的,不是特别重要, 接下来就是重要的修改部分: 方法一: 修改“pch.h”和“dllmain.cpp”文件,可以参考以下博主链接,但博主的引用部分有些繁琐,文末会介绍我的引用方法,和正常引用外部库步骤是一样的。这

    2023年04月09日
    浏览(38)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包