我安装的环境是Qt_5_8_0_MSVC2015_64bit,或许不同环境下编译有所不同,我就我自己的安装环境进行叙述一下吧。
1.添加一个新项目,作为静态库项目
2.选择静态库,并完成就可以了
这时候发现生成的项目是个空项目,需要我们自己进行添加.h和.cpp文件,我们建立两个文件mylib.h和mylib.cpp文件,代码如下:
mylib.h
#ifndef _MYLIB_H_INCLUDE #define _MYLIB_H_INCLUDE extern "C" int TestSum(int a, int b); extern "C" void TestMessageBox(); #endif // !_MYLIB_H_INCLUDE
mylib.cpp
#include "mylib.h" #include <Windows.h> int TestSum(int a, int b) { return a + b; } void TestMessageBox() { MessageBox(NULL, L"Hello", L"World", 0); }
编译生成动态库mylib.lib。
3.我们现在建立一个Qt GUI程序测试一下。
然后将main.cpp改为如下所示就可以了
#include "test.h" #include <QtWidgets/QApplication> #include "../MyLib/mylib.h" #pragma comment(lib,"../x64/Debug/mylib.lib") //因为Qt的GUI程序有的不会加载user32.dll动态库,所以为了正常调用MessageBox需要显式加载user32.lib #pragma comment(lib,"user32.lib") int main(int argc, char *argv[]) { QApplication a(argc, argv); Test w; w.show(); TestSum(1, 2); TestMessageBox(); return a.exec(); }
我们会看到程序执行调用了Windows API函数MessageBox。
4.我们这时候来测试一下动态库
新建一个动态库工程,更改dllmain.cpp如下:
#include "stdafx.h" #include <Windows.h> extern "C" int __declspec(dllexport) Test(int a, int b); BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: { MessageBox(NULL, L"Success", L"Load", 0); break; } case DLL_THREAD_ATTACH: case DLL_THREAD_DETACH: case DLL_PROCESS_DETACH: break; } return TRUE; } int Test(int a, int b) { return a + b; }
这个我们在一加载动态库时就可以弹出MessageBox,并导出了一个Test函数。
#include "test.h" #include <QtWidgets/QApplication> #include <QLibrary> #include <QMessageBox> #include "../MyLib/mylib.h" #pragma comment(lib,"../x64/Debug/mylib.lib") //因为Qt的GUI程序有的不会加载user32.dll动态库,所以为了正常调用MessageBox需要显式加载user32.lib #pragma comment(lib,"user32.lib") typedef int(*pfnTest)(int a, int b);//定义函数指针 int main(int argc, char *argv[]) { QApplication a(argc, argv); Test w; w.show(); TestSum(1, 2); TestMessageBox(); //声明所需要加载的动态库 QLibrary mydll("../x64/Debug/mydll.dll"); //加载动态库 if (!mydll.load()) { QMessageBox::about(NULL, "Defeated", "Load"); } //获得Test导出函数地址
pfnTest Test = (pfnTest)mydll.resolve("Test"); int sum = Test(1, 2); return a.exec(); }