Qt调用VC++生成的动态链接库 | 您所在的位置:网站首页 › qt生成lib库 › Qt调用VC++生成的动态链接库 |
Qt如何调用VC++生成的动态链接库?假设当前有VC++编译器生成的动态库文件testdll.h,testdll.lib和testdll.dll。 testdll.h文件源码如下: #ifdef TESTDLL_EXPORTS #define TESTDLL_API __declspec(dllexport) #else #define TESTDLL_API __declspec(dllimport) #endif // 此类是从 testdll.dll 导出的 class TESTDLL_API Ctestdll { public: Ctestdll(void); public: int Add(int a, int b) {return a+b;} int Sub(int a, int b) {return a-b;} int Mul(int a, int b) {return a*b;} }; extern TESTDLL_API int ntestdll; TESTDLL_API int fntestdll(void); Qt如何使用这些动态链接库文件? 一、情况1,编程环境是Qt Creator+Qt libraries 4.8.6 for Windows (VS 2010) Qt库是VS2010版本,VC++编译器生成的。所以工程可以直接使用testdll.h头文件和testdll.lib引入库文件。 1、把testdll.h拷贝到工程路径; 2、工程文件XXX.pro需要手动添加"HEADERS += testdll.h"和"LIBS += testdll.lib"; 3、编译前,需要把lib文件:testdll.lib和testdll.dll一起拷贝到构建路径下面。 如此便可以正常使用VC++动态链接库函数。 二、情况2,编程环境是Qt Creator+Qt libraries 4.8.6 for Windows (MinGW 4.8.2) Qt库是MinGW版本,gcc编译器生成,与VC++编译器不是同个体系。所以工程不可以使用testdll.h头文件和testdll.lib引入库文件。 对于调用DLL的方法,Qt本身就有相应的类来实现。 #include "dialog.h" #include #include typedef int (*func_Add)(int a, int b); //定义函数指针 typedef int (*func_Sub)(int a, int b); typedef int (*func_Mul)(int a, int b); int main(int argc, char *argv[]) { QApplication a(argc, argv); QLibrary mylib("testdll.dll");//testdll.dll的存放路径与.exe一致 if (mylib.load()) { //"?Add@Ctestdll@@QAEHHH@Z"等字符串其实就是动态库函数int Add(int a, int b)的变体,请使用微软工具DEPENDS.EXE查看得到 func_Add f1 = (func_Add)mylib.resolve("?Add@Ctestdll@@QAEHHH@Z"); func_Sub f2 = (func_Sub)mylib.resolve("?Sub@Ctestdll@@QAEHHH@Z"); func_Mul f3 = (func_Mul)mylib.resolve("?Mul@Ctestdll@@QAEHHH@Z"); int rt = 0; if (f1 != NULL) { rt = f1(10, 12); } if (f2 != NULL) { rt = f2(10, 12); } if (f3 != NULL) { rt = f3(10, 12); } } Dialog w; w.show(); return a.exec(); } |
CopyRight 2018-2019 实验室设备网 版权所有 |