QT鏈結庫中類的匯出,以及使用

2021-06-28 05:05:58 字數 1622 閱讀 7217

主體思路如下:

我們的動態鏈結庫建立乙個基類,裡面的函式全部是純虛函式,之後再建立乙個子類繼承基類,實現裡面的函式,最後匯出乙個函式,這個函式返回乙個子類的物件但是卻被強制轉換為基類的基類指標。然後在應用程式中也對應建立乙個基類,之後呼叫匯出的函式,就可以使用子類實現的哪些功能了。

動態鏈結庫的建立

myclass_lib.h

#ifndef myclass_lib_h

#define myclass_lib_h

#include

class baseclass                                       //基類,全部是純虛函式,也即匯出的介面

;class sonclass : public baseclass                     // 子類,實現虛函式

;extern "c" _declspec(dllexport) baseclass* create();    //這個函式用來返回乙個指向子類但返回值為父類的指標

#endif // myclass_lib_h

myclass_lib.cpp

#include "myclass_lib.h"

baseclass* create()

int sonclass::add(int x, int y)                 //函式的實現

int sonclass::sub(int x, int y)

之後編譯就可以生成我們需要的myclass_lib.dll了,之後就是dll的引用了。

我在devcpp環境下新建乙個.cpp檔案,**如下:

my_lib_class.cpp

#include

#include

#include

#include

class baseclass             //同樣的基類  

;  int main() 

create create;    

create = (create)getprocaddress(hdll, "create"); //取得函式位址     

if(create == null)    

test = create();                                 //test為create()返回的乙個父類的指標    

printf("3 + 2 = %d \n", test->add(3, 2));        //函式呼叫     

printf("3 - 2 = %d \n", test->sub(3, 2));          

flag = freelibrary(hdll);                //釋放鏈結庫    

if(flag == 0)    

system("pause");   

return 0;   

} 把dll複製到該檔案目錄下,編譯執行,結果如下圖:

qt鏈結庫中類的匯出,以及使用 - vanpire110 - vanpire110的部落格

呼叫成功。

附:不知道認真的閱者有沒有發現這個程式的乙個問題,就是dll new了乙個子類的物件都沒有釋放,這個問題還沒有具體找出想法,還望大家指教。

Linux 關於動態鏈結庫以及靜態鏈結庫的一些概念

庫有動態與靜態兩種,動態通常用.so為字尾,靜態用.a為字尾。例如 libhello.so libhello.a 為了在同一系統中使用不同版本的庫,可以在庫檔名後加上版本號為字尾,例如 libhello.so.1.0,由於程式連線預設以.so為檔案字尾名。所以為了使用這些庫,通常使用建立符號連線的方...

Linux 關於動態鏈結庫以及靜態鏈結庫的一些概念

動態庫 dynamic link library abbr,dll 技術是程式設計中經常採用的技術。其目的減少程式的大小,節省空間,提高效率,具有很高的靈活性。採用動態庫技術對於公升級軟體版本更加容易。與靜態庫 static link library 不同,動態庫裡面的函式不是執行程式本身的一部分,...

Qt建立和使用動態鏈結庫

一 建立共享庫 1 新其他建專案,選擇 c 庫 2 選擇共享庫,並取專案名稱,單擊下一步。這裡取名位mylib 3 按預設配置單擊下一步至模組選項,選擇所需支援的模組。這裡勾選qtcore 和qtgui。4 直接下一步至完成。現在乙個共享庫的工程就新建好了。5 右擊專案新增新檔案,選擇qt 設計師介...