Qt如何調用VS編寫的動態鏈接庫(dll文件)


在最近的開發中需要做了demo,來驗證公司的老項目能否在Qt上做重新開發;於是碰到的第一個問題那就是dll文件如何加載了;網上查閱了很多資料,記錄一下已成功加載dll文件的方法,以防遺忘。

下面是我在VS編譯器上寫的一個簡單的dll文件,關於dll文件如何編寫,我就不再贅述了。

.h文件

#ifndef  _MYDLL_H
#define _MYDLL_H

#ifdef MYDLL_EXPORTS
#define  MYDLL_API __declspec(dllexport)
#else
#define  MYDLL_API __declspec(dllimport)
#endif 

extern "C" MYDLL_API int add(int a, int b);

#endif

.cpp文件

#include "mydll.h"

extern "C" MYDLL_API int add(int a, int b)
{
    return (a + b);
}

編譯成功后,會得到下面三個文件,mydll.h、MyDll.lib、MyDll.dll

然后打開Qt創建一個項目;我是把這三個文件全部拷貝到了運行工作目錄;如下所示:

下面介紹一下Qt如何隱式調用dll文件:

打開.Pro文件

在工程文件中包含.h文件的路徑以及庫文件的路徑即可,下面就是如何調用庫文件中的函數了:

#include <QDebug>
#include <QLibrary>
#include "mydll.h"  //包含頭文件


int main()
{
    qDebug() << add(10, 20);
    return 0;
}

上述是隱式調用庫文件的函數,還有一種顯示調用方法,如下所示:

#include <QDebug>
#include <QLibrary>
#include "mydll.h"  //包含頭文件

typedef int(*pFun)(int, int);

int main()
{
    QLibrary mydll("MyDll.dll");
    if(!mydll.load())
    {
        qDebug() << "load dll error";
    }
    else
    {
        qDebug() << "load dll success";
        pFun myAdd = (pFun)mydll.resolve("add");
        if(myAdd){
            qDebug() << myAdd(1, 10);
        }
        else
        {
          qDebug() << "get Function address error";
        }

    }
    if(mydll.isLoaded())
    {
        mydll.unload();
    }

    return 0;
}

相較而言,隱式調用比顯示調用更加簡潔,通常都是選擇隱式調用更為合適。

當然,在配置庫文件的路徑時,也可以選擇用相對路徑的方式,如下所示:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM