首页 > 网络 > 经典语录

QT编写DLL并调用详解

常驻编辑 经典语录 2022-09-18 前缀   静态   详解   函数   源码   类型   代码   文件   程序   方法   动态

创建DLL源文件

eGr拜客生活常识网

创建好后如图:eGr拜客生活常识网

eGr拜客生活常识网

编写函数

DLL在QT中可以静态调用也可以动态调用,如果只采用静态调用的方法,那DLL的函数编写和普通程序没有什么差别。如果要使用动态调用的方法,那么函数必须是C函数!eGr拜客生活常识网

C没有“类”的概念,因此像void sky::test() 这样的写法是错误的!eGr拜客生活常识网

C函数的编写:

1、在.h头文件中:eGr拜客生活常识网

//导出宏
#ifdef Q_OS_WIN
#define MY_EXPORT __declspec(dllexport) //Windows系统需要这个参数
#else
#define MY_EXPORT
#endif

//定义一个C函数
extern "C" MY_EXPORT int Cfun(int i); //导出函数必须使用 extern "C" MY_EXPORT 做前缀

注意:如上面代码所示, C导出函数必须使用:extern "C" MY_EXPORT 作为前缀eGr拜客生活常识网

2、.cpp文件:eGr拜客生活常识网

//这里也必须使用 extern "C" MY_EXPORT 作为前缀
extern "C" MY_EXPORT int Cfun(int i){
    return i;
}

这样,一个简单的C函数就写好了,编译即可产生dll文件。eGr拜客生活常识网

需要注意的是:如果要让DLL文件在其它编程工具中调用, 变量类型不要使用QT专有类型,比如QStringeGr拜客生活常识网

题外话,QString的处理速度比string要慢60%-70%eGr拜客生活常识网

QT调用DLL的方法

一、静态调用

1、将dll源码目录中的两个.h文件拷贝到程序源码目录下,如图:eGr拜客生活常识网

eGr拜客生活常识网

2、在.h头文件中include,如图:eGr拜客生活常识网

eGr拜客生活常识网

3、拷贝DLL文件eGr拜客生活常识网

如果DLL采用MSVC编译,将生成的.dll和.lib文件拷贝到程序目录下,如图:eGr拜客生活常识网

eGr拜客生活常识网

当然,为了源码目录整洁,可以创建目录将它们放在下级目录中。eGr拜客生活常识网

如果DLL文件是Min征婚交友注册GW编译,只需拷贝DLL文件。eGr拜客生活常识网

4、在.pro文件末尾添加一行:eGr拜客生活常识网

LIBS += -L$PWD -lskyLib

其中,-L表示指定库路径,$PWD表示.pro文件所在路径,-l加载库文件。eGr拜客生活常识网

如果程序使用MSVC编译器,还可以使用其专属方法,在.h头文件中添加:eGr拜客生活常识网

#pragma comment(lib,"Z:testskyLib") //MSVC编译器专属方法,不推荐使用

并不推荐使用这种专属方法来加载DLL,如果使用了,那么还要将.dll和.lib文件拷贝到编译输出目录中,如图:eGr拜客生活常识网

eGr拜客生活常识网

否则调试不了,会报程序异常结束,如图:eGr拜客生活常识网

eGr拜客生活常识网

设置成功后,就可以使用DLL中的函数了。eGr拜客生活常识网

5、使用DLL中的函数eGr拜客生活常识网

C函数可以直接使用,如图:eGr拜客生活常识网

eGr拜客生活常识网

普通函数,则需要创建类实例,如图:eGr拜客生活常识网

eGr拜客生活常识网

二、动态调用

动态调用无须在.pro文件中设置LIBS,也不需要导入dll的头文件,但DLL的导出函数必须是C函数!C函数的编写方法如果忘了,可以翻上去再看一下eGr拜客生活常识网

先来看一下C函数和普通函数的区别:eGr拜客生活常识网

eGr拜客生活常识网

上图Cfun是C函数,其它是普通函数。普通函数名称像这样,是无法调用的!eGr拜客生活常识网

动态调用方法:

1、在.h头文件中添加代码:eGr拜客生活常识网

#include "QLibrary"
typedef int (*newCfun)(int i);
newCfun funtest; //用于存放DLL函数的指针

typedef这句代码中,第一个int是函数类型,要和导出函数中的类型一致,(*newCfun) 这个名称自取,和导出函数无关。(int i)对应导出函数中的参数,类型、数量需要一致。

相关阅读:

  • 为什么很多人都迷恋“测一测”?
  • 德杯导播出大事,兮夜接受采访被标错队名,网友:太离谱了
  • 解决单词肠梗阻的方法,纯干货,人人学得会
  • 语言学家遗留下的“由一个单词学会一群单词”的宝贵遗
  • 黄磊女儿图书馆不雅行为谣言背后的黑手,请停止你的羡慕
  • 上帝真的存在吗?上帝God等于he来告诉你
  • 学渣变学霸的开窍术,纯干货!人人学得会
  • 如何设置静态ip(如何查看静态ip地址)
  • 如何制作gif图片(怎么把静态图片做成动态图)
  • 数据打脸!防守不好天赋不行?灰熊赛前迷之自信变赛后一脸
    • 网站地图 |
    • 声明:登载此文出于传递更多信息之目的,并不意味着赞同其观点或证实其描述。文章内容仅供参考,不做权威认证,如若验证其真实性,请咨询相关权威专业人士。