Qt可以调用vc生成的dll,反之qt也可以提供生成的dll给其它语言来调用,比如VC、rust等。
一、qt生成dll
在Qt creator加持下已经很容易的生成DLL,如下:
1、新建,库,C++ Library;
2、类型,选择 Shared Library,qt module选择无,否则纯VC项目必须导入qt库;
3、第10行,声明并定义函数add(),最后按ctr b生成(注意这里不是ctrl r运行,是生成,也就是qt所说的“构建”,同时注意默认为debug,左下角切换输出为Release),最后会在Release目录下看到tell.dll和test.lib
4、导出函数名查看
此时为了确保dll无误,使用来查看dependency walker,打开test.dll,查看函数名(win11可能无响应,请复制test.dll和工具,去win10及一下试试),结果居然是
?add@Test@@QEAAHHH@Z难道不应是add?
出现这种情况,你知道在vc中是无法调用成功的,因为函数名在编译时已经发生变化。原因是:C++编译器因为不统一的原因在生成dll时会对导出函数根据编译器进行名字改编,这也就导致原来add变成了 ?add@Test@@QEAAHHH@Z
此时其实大家最常用的方案是利用限定符extern “C”,但是这也意味着类的成员函数无法使用,只能导出全局函数,当然你要觉得dll不想用类的成员函数,那不会有问题直接使用即可。
本文讨论是不使用extern “C”且有类成员函数的情况:
二、vc调用Qt生成的dll
1、新建控制台项目,并将项目切到Release x64,将dll项目的.lib和.h复制到vs项目目录下,分别添加到头文件和资源文件;
2、将dll复制到vs生成的exe所在目录下;
3、直接包含头文件,将类实例化,调用函数即可;
4、将exe和dll复制到没有编译器的环境中测试,也正常如下:
备注:如果一开始建的dll库包含了qt模块,那么后续调用建议用qt creator创建qt widgets项目再去调用dll。