最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Qt動態(tài)庫調(diào)用宿主進(jìn)程中的對象方法純虛函數(shù)使用

 更新時間:2022年08月12日 16:20:44   作者:Fake瑞克  
這篇文章主要為大家介紹了Qt動態(tài)庫調(diào)用宿主進(jìn)程中的對象方法純虛函數(shù)使用,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

引言

可執(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)入方式(在程序未運(yùn)行時完成導(dǎo)入)
gcc demo.cpp -o demo -L./libs -ladd

在運(yùn)行時加載動態(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;

本貼重點(diǎn):在動態(tài)庫中調(diào)用宿主進(jìn)程的對象方法

先復(fù)習(xí)下兩個概念:純虛函數(shù)虛函數(shù)表

  • 純虛函數(shù)在類中定義后是可以不用實(shí)現(xiàn)的,子類如繼承含有純虛函數(shù)的類必須實(shí)現(xiàn)該類所有的純虛函數(shù)。純虛函數(shù)可作接口使用。
  • C++擁有虛函數(shù)表(V-Table),存儲著虛函數(shù)地址的表。

假設(shè)動態(tài)庫需要調(diào)用宿主進(jìn)程的對象方法,在動態(tài)庫編譯時時無法獲取到宿主程序該對象的實(shí)現(xiàn)的,所以按照正常邏輯是無法編譯通過的。

但是通過上邊有效的復(fù)習(xí)可以知道純虛函數(shù)在調(diào)用時可無需實(shí)現(xiàn)(在運(yùn)行時通過查詢虛函數(shù)表后獲取實(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實(shí)例傳遞給動態(tài)庫
        setObj(this);
    }
    int add(int x, int y) ovdrride {
        return x + y;
    }
private:
    QLibrary m_library;
}
#endif

然后將接口做成一個獨(dú)立的頭文件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)用,在宿主程序中實(shí)例化Math類,并調(diào)用其Test方法,在Test方法中會加載動態(tài)庫,并將Math實(shí)例的指針傳遞給動態(tài)庫,動態(tài)庫將Math實(shí)例強(qiáng)轉(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)文章

最新評論

晋城| 泰兴市| 武宣县| 平顺县| 嘉定区| 开封市| 长沙市| 清新县| 巴马| 棋牌| 府谷县| 津南区| 石河子市| 丰顺县| 菏泽市| 綦江县| 南丰县| 措勤县| 驻马店市| 射洪县| 阳谷县| 保康县| 嵊州市| 夏津县| 四平市| 思茅市| 霍邱县| 石景山区| 酉阳| 岳西县| 南涧| 临澧县| 尉氏县| 邢台市| 石棉县| 盖州市| 湖南省| 上虞市| 越西县| 鄂伦春自治旗| 新乡市|