Qt使用.lib静态库和.dll动态库文件

我安装的环境是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(); }
posted @ 2017-04-24 23:16  Toring  阅读(1208)  评论(0编辑  收藏  举报