(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,手動修改的方式,但是手動修改往往有編譯不通過的問題,提示...