<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
可執行程式載入動態庫並呼叫動態庫匯出的函數是比較容易的:
匯入庫對應的標頭檔案
在CPP檔案中呼叫函數
在連結程式時加上動態庫作為引數
假設demo.cpp中需要用到動態庫libadd.so
中的某個函數,可能是int add(int x, int y)
,那麼我們編譯時就需要連結上libadd.so, gcc引數中-L./libs
指定了當前目錄下的libs目錄為庫的目錄,-ladd
指定了libadd.so動態庫檔案,注意這裡並未使用全稱,讓編譯器自動適配即可。
// 該方式為靜態匯入方式(在程式未執行時完成匯入) gcc demo.cpp -o demo -L./libs -ladd
// 匯入動態庫 QLibrary m_library; m_library.setFileName("./libs/libadd.so"); assert(m_library.load()); // 獲取函數指標 typedef int (*FUNC_ADD)(int, int); FUNC_ADD add = (FUNC_ADD)m_library.resolve("add"); assert(add); // 愉快的使用add函數 int a = add(125, 125); qDebug() << a;
先複習下兩個概念:純虛擬函式和虛擬函式表
假設動態庫需要呼叫宿主程序的物件方法,在動態庫編譯時時無法獲取到宿主程式該物件的實現的,所以按照正常邏輯是無法編譯通過的。
但是通過上邊有效的複習可以知道純虛擬函式在呼叫時可無需實現(在執行時通過查詢虛擬函式表後獲取實際地址),這樣就可以順利的完成了編譯,當動態庫被載入進宿主程序後就可以正常呼叫物件的方法了。
宿主程式:
#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範例傳遞給動態庫 setObj(this); } int add(int x, int y) ovdrride { return x + y; } private: QLibrary m_library; } #endif
然後將介面做成一個獨立的標頭檔案imath.h
,用來給動態庫呼叫
#ifndef __IMATH_H__ #define __IMATH_H__ class IMath { public: virtual int add(int x, int y) = 0; }; #endif
動態庫程式(libtest.cpp):
void setObj(void* obj) { IMath* math = static_cast<IMath*>(obj); qDebug() << math->add(125, 125); }
將動態庫程式編譯後放入libs目錄下給宿主程式呼叫,在宿主程式中範例化Math類,並呼叫其Test方法,在Test方法中會載入動態庫,並將Math範例的指標傳遞給動態庫,動態庫將Math範例強轉為介面型別並呼叫其中的純虛擬函式add()
。
以上就是Qt動態庫呼叫宿主程序中的物件方法純虛擬函式使用的詳細內容,更多關於Qt動態庫呼叫宿主程序純虛擬函式的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45