Qt動態(tài)庫調(diào)用宿主進(jìn)程中的對象方法純虛函數(shù)使用
引言
可執(zhí)行程序加載動態(tài)庫并調(diào)用動態(tài)庫導(dǎo)出的函數(shù)是比較容易的:
導(dǎo)入庫對應(yīng)的頭文件
在CPP文件中調(diào)用函數(shù)
在鏈接程序時加上動態(tài)庫作為參數(shù)
假設(shè)demo.cpp中需要用到動態(tài)庫libadd.so
中的某個函數(shù),可能是int add(int x, int y)
,那么我們編譯時就需要鏈接上libadd.so, gcc參數(shù)中-L./libs
指定了當(dāng)前目錄下的libs目錄為庫的目錄,-ladd
指定了libadd.so動態(tài)庫文件,注意這里并未使用全稱,讓編譯器自動適配即可。
// 該方式為靜態(tài)導(dǎo)入方式(在程序未運行時完成導(dǎo)入) gcc demo.cpp -o demo -L./libs -ladd
在運行時加載動態(tài)庫并獲取對象指針(QLibrary)
// 導(dǎo)入動態(tài)庫 QLibrary m_library; m_library.setFileName("./libs/libadd.so"); assert(m_library.load()); // 獲取函數(shù)指針 typedef int (*FUNC_ADD)(int, int); FUNC_ADD add = (FUNC_ADD)m_library.resolve("add"); assert(add); // 愉快的使用add函數(shù) int a = add(125, 125); qDebug() << a;
本貼重點:在動態(tài)庫中調(diào)用宿主進(jìn)程的對象方法
先復(fù)習(xí)下兩個概念:純虛函數(shù)和虛函數(shù)表
- 純虛函數(shù)在類中定義后是可以不用實現(xiàn)的,子類如繼承含有純虛函數(shù)的類必須實現(xiàn)該類所有的純虛函數(shù)。純虛函數(shù)可作接口使用。
- C++擁有虛函數(shù)表(V-Table),存儲著虛函數(shù)地址的表。
假設(shè)動態(tài)庫需要調(diào)用宿主進(jìn)程的對象方法,在動態(tài)庫編譯時時無法獲取到宿主程序該對象的實現(xiàn)的,所以按照正常邏輯是無法編譯通過的。
但是通過上邊有效的復(fù)習(xí)可以知道純虛函數(shù)在調(diào)用時可無需實現(xiàn)(在運行時通過查詢虛函數(shù)表后獲取實際地址),這樣就可以順利的完成了編譯,當(dāng)動態(tài)庫被加載進(jìn)宿主進(jìn)程后就可以正常調(diào)用對象的方法了。
還是以add方法為例寫一個Demo
宿主程序:
#ifndef __MATH_H__ #define __MATH_H__ // 接口定義 class IMath { public: virtual int add(int x, int y) = 0; }; typedef void (*FUNC_SET_OBJ)(void*); class Math: public IMath { public: Test() { m_library.setFileName("./libs/libtest.so"); assert(m_library.load()); FUNC_SET_OBJ setObj= (FUNC_SET_OBJ)m_library.resolve("setObj"); assert(setObj); // 將Math實例傳遞給動態(tài)庫 setObj(this); } int add(int x, int y) ovdrride { return x + y; } private: QLibrary m_library; } #endif
然后將接口做成一個獨立的頭文件imath.h
,用來給動態(tài)庫調(diào)用
#ifndef __IMATH_H__ #define __IMATH_H__ class IMath { public: virtual int add(int x, int y) = 0; }; #endif
動態(tài)庫程序(libtest.cpp):
void setObj(void* obj) { IMath* math = static_cast<IMath*>(obj); qDebug() << math->add(125, 125); }
將動態(tài)庫程序編譯后放入libs目錄下給宿主程序調(diào)用,在宿主程序中實例化Math類,并調(diào)用其Test方法,在Test方法中會加載動態(tài)庫,并將Math實例的指針傳遞給動態(tài)庫,動態(tài)庫將Math實例強轉(zhuǎn)為接口類型并調(diào)用其中的純虛函數(shù)add()
。
以上就是Qt動態(tài)庫調(diào)用宿主進(jìn)程中的對象方法純虛函數(shù)使用的詳細(xì)內(nèi)容,更多關(guān)于Qt動態(tài)庫調(diào)用宿主進(jìn)程純虛函數(shù)的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C語言實現(xiàn)線索二叉樹的前中后創(chuàng)建和遍歷詳解
這篇文章主要為大家詳細(xì)介紹了C語言實現(xiàn)線索二叉樹的前中后創(chuàng)建和遍歷,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助2022-02-02