• 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(); }
  • 相关阅读:
    力扣(LeetCode)922. 按奇偶排序数组 II
    力扣(LeetCode)1002. 查找常用字符
    力扣(LeetCode)15. 三数之和
    Java == 和 equals 区别
    力扣(LeetCode)125. 验证回文串
    力扣(LeetCode) 905. 按奇偶排序数组
    力扣(LeetCode)832. 翻转图像
    力扣(LeetCode) 771. 宝石与石头
    Sticks
    荷马史诗
  • 原文地址:https://www.cnblogs.com/Toring/p/6759718.html
Copyright © 2020-2023  润新知