-
VS2019端:
a 基于生成一个DLL的工程(要注意生成是x86,还是x64的,需要和后面的QT的App工程对应),这里不多解释了,网上多的是;
b 在cpp实现文件里,假如要导出一个这样的函数:
int add(int a, int b)
{
return a+b;
}
那么,它对应的头文件,如abc.h,一定如下:即在头文件里,使用了extern "C"来限制这个函数名,这样的目的是在c++编译器下,产生c语言的编译链接规则:
#ifdef __cplusplus
extern "C" {
#endif
int add(int a, int b);
#ifdef __cplusplus
}
#endif
(具体c++和c语言编译链接规则extern "C",参考:extern “C”的作用详解 - 狂奔~ - 博客园 (cnblogs.com)https://www.cnblogs.com/xiangtingshen/p/10980055.html)
注意,上述的cpp实现文件的函数名前,不要加extern "C"。
c 为了产生lib文件,在VS2019工程里添加def文件,这样的目的是生成DLL后导出的函数名为add,而不是乱七八糟的添加@各种前缀;还有一个目的是生成DLL的同时,还会生成lib文件,即如果不添加def文件,默认是不会产生lib文件的。
LIBRARY
EXPORTS
add @1
d 编译工程,产生DLL后,一定使用VS2019环境——【工具】——【VS命令提示】检查一下产生的dll是否符合预期要求:
在弹出的控制台输入命令:dumpbin /exports abc.DLL
如上图,可以看到导出的函数名为add。
QT端:
a 生成一个基于exe的App工程,注意32位/64位,一定和上面VS工程对应;
b 在pro工程文件里添加上面VS2019生成的DLL工程引用:
LIBS += "C:/abc/Debug/abc.lib"
(注意,这里添加的是lib文件名,测试引用DLL文件名也可以!)
c 引用上面VS产生的头文件abc.h,在cpp里直接使用add函数即可。