遇到Qt呼叫dll問題 整理版

2021-06-18 15:11:09 字數 4315 閱讀 8946

(younghz)遇到qt呼叫dll問題,search後整理如下:

首先列出幾種錯誤,然後介紹解決方法。

(younghz後加:正確格式應該在-l和-l之後沒有空格--14.3.30)

解決方法:

dll與lib的區別

1.dll是乙個完整程式,其已經經過鏈結,即不存在同名引用,且有匯出表,與匯入表lib是乙個**集(也叫函式集)他沒有鏈結,所以lib有冗餘,當兩個lib相鏈結時位址會重新建立,當然還有其它相關的不同,用lib.exe就知道了;

2.在生成dll時,經常會生成乙個.lib(匯入與匯出),這個lib實際上不是真正的函式集,其每乙個匯出匯入函式都是跳轉指令,直接跳轉到dll中的位置,這個目的是外面的程式呼叫dll時自動跳轉;

3.實際上最常用的lib是由lib.exe把*.obj生成的lib。(引用這裡

)qt 想呼叫dll怎麼辦呢?最先想到的是直接呼叫試試看:包含標頭檔案,並把dll檔案拷到當前目錄下,呼叫宣告的函式,結果鏈結時和預想的一樣出錯了。修改 makefile.debug,的鏈結選項也不行。windows裡的gcc調編譯時用的庫是和linux一樣的.a檔案。其實,上面用vc直接呼叫 dll的方法,在windows裡其實叫「隱式鏈結」,相對的叫「顯式鏈結」,可以參考csdn的解釋。

qt呼叫dll方法一:

使用win32 api

在顯式鏈結下,應用程式必須進行函式呼叫以在執行時顯式載入 dll。為顯式鏈結到 dll,應用程式必須:

? 呼叫 loadlibrary(或相似的函式)以載入 dll和獲取模組控制代碼。

? 呼叫 getprocaddress,以獲取指向應用程式要呼叫的每個匯出函式的函式指標。由於應用程式是通過指標呼叫 dll的函式,編譯器不生成外部引用,故無需與導入庫鏈結。

? 使用完 dll 後呼叫 freelibrary。

例如:

typedef uint (callback* lpfndllfunc1)(dword,uint);

hinstance hdll; // handle to dll

lpfndllfunc1 lpfndllfunc1; // function pointer

dword dwparam1;

uint uparam2, ureturnval;

hdll = loadlibrary(」mydll」);

if (hdll != null)

else

}

需要說明的是,typedef uint (callback* lpfndllfunc1)(dword,uint);是宣告想要呼叫的函式指標,這個函式的引數必須和dll裡面的一樣。dllfunc1是dll裡面

的「實際的函式名」,必須和標頭檔案裡面宣告的一樣,否則將會呼叫失敗。使用需要加windows.h標頭檔案。windows裡的qt是用mingw gcc來編譯,而mingw gcc可以支援win32的api。使用時並不需要包含標頭檔案。這個方法沒有實際驗證,理論上是可以的。

qt呼叫dll方法二:使用qt的api

對於呼叫dll的方法,qt原來本身就有相應的類來實現,用起來和win32的步驟差不多。下面是**,已經編譯通過。在控制台依次輸入qmake –project、qmake、 nmake,即可。

#include

#include

#include

//動態鏈結不需要包含ltm8000d.h標頭檔案

typedef int ( *pcom_open)(int , int , int ); //定義函式指標

int main(int argc, char *argv)

else

}else

label1.show();

label2.show();

return a.exec();

}

qt呼叫dll方法三:直接呼叫 dllvc的引用庫檔案為***.lib, gcc的為***.a,通過比較兩種庫檔案的格式,發現很相似。於是把***.dll,***.lib和***.h複製到qt的project下,直接把***.lib改為***.a,根據qt的庫名字的格式,

在***.a的前面加上lib,

即為lib***.a。

再在qt的.pro檔案中最後面加上

libs += -l. –l***  //增加當前目錄下的lib***.a

在qt的原始檔中加上

#include 「***.h」

現在就可以直接呼叫***.h中的函式了。

// ***.h

#ifndef ***_h

#define ***_h

winapi int ***_func(void);

#endif

// main.cpp

#include 「***h」

#include

#include

int main(int argc, char *argv)

label1.show();

return a.exec();

}

以下是另乙個人的總結: qt

呼叫dll

中的功能函式

宣告:事先我已經自己動手寫了乙個簡單的

dll檔案

(mydll.dll),c

版介面的。並且用我前兩篇有關

dll文章裡面的方法,從

dll中匯出了導入庫

(.lib)

檔案,dll

中有兩個函式,原型如下:

void

helloworld();    

//函式內部呼叫

win32 api,

功能是彈出乙個

helloworld

提示框int

add(

inta,

intb);  

//實現兩個數相加,並返回結果

下面分別通過顯示呼叫和隱式呼叫兩種方法,來模擬

qt如何呼叫外部

dll檔案中的功能函式,

follow me....

預備知識:

1、如果在沒有導入庫檔案

(.lib)

,而只有標頭檔案

(.h)

與動態鏈結庫

(.dll)

時,我們才需要顯示呼叫,如果這三個檔案都全的話,我們就可以使用簡單方便的隱式呼叫。 2

、通常windows

下程式顯示呼叫

dll的步驟分為三步

(三個函式):

loadlibrary()

、getprocadress()

、freelibrary()

其中,loadlibrary()

函式用來載入指定的

dll檔案,載入到呼叫程式的記憶體中

(dll

沒有自己的記憶體!)

getprocaddress()

函式檢索指定的動態鏈結庫

(dll)

中的輸出庫函式位址,以備呼叫

freelibrary()

釋放dll

所佔空間

1

、顯示呼叫 qt

提供了乙個

qlibrary

類供顯示呼叫。下面給出乙個完整的例子:

6 typedef int (*fun)(int,int);//定義函式指標,以備呼叫

7 int main(int argc,char **argv)

8  )

下面是隱式呼叫的例項**:

4 7 int main(int argv ,char **argv)

8 {10 hellowordl(); //呼叫win32 api 彈出helloworld對話方塊

11 qdebug()<

還是隱式呼叫方便啊,直接就可以呼叫

dll中的函式

...

當然我最後還是用的隱式呼叫。。問題解決

QT生成DLL,呼叫DLL

一.靜態庫的生成 1.測試目錄 lib 2.原始碼檔名 mywindow.h,mywindow.cpp,類mywindow繼承於qpushbutton,並將文字設定為 i m in class mywindow 3.編寫專案檔案 mywindow.pro 注意兩點 template lib conf...

QT生成DLL,呼叫DLL

一.靜態庫的生成 1.測試目錄 lib 2.原始碼檔名 mywindow.h,mywindow.cpp,類mywindow繼承於qpushbutton,並將文字設定為 i m in class mywindow 3.編寫專案檔案 mywindow.pro 注意兩點 template lib conf...

Qt呼叫Python遇到的問題(一)

一般情況下,預設安裝的python版本是release版本,因此安裝檔案中庫獲取的版本也為release版本,在c 需要呼叫debug版本時,網上有兩種解決方案,第一種沒有親測。可以將python27.lib修改為python27 d.lib,手動修改的方式,但是手動修改往往有編譯不通過的問題,提示...