最近在修改meshlab的源**,使其能夠展示我們自己的資料格式。看meshlab源**的時候發現它的架構非常漂亮,因此決定好好研究一下,後面其他**重構的時候可以參考這個架構。
meshlab使用qt實現,整體工程由主窗體和多個子功能模組組成,使用subdirs工程檔案進行子專案的組織。各個子模組與主窗體是松耦合的,編譯時不相互依賴,編譯完成之後主窗體載入模組的動態鏈結庫,如果沒有相應的庫或者載入失敗則沒有相應功能,而不影響其他功能。
我編譯時使用如下的乙個subdirs工程檔案
template= subdirs
config+= ordered
subdirs= common \
meshlab \
meshlabplugins/io_rawdata
一共編譯三個子工程,common,meshlab
以及io_rawdata
,前兩個工程是meshlab的基礎,是必需編譯的,最後乙個是可選的功能模組。下面分別介紹一下這三個子工程。
common
工程編譯出來是乙個靜態庫,其他所有的工程都需要鏈結這個靜態庫common.lib
,這個工程只是負責介面的宣告,功能由具體的模組實現,由主窗體呼叫。比如我編寫如下的乙個介面宣告乙個純虛函式testfunc
,這個函式會由io_rawdata
實現,並在meshlab
中被呼叫。
class rawdataiointe***ce
virtual int testfunc()=0;
};#define rawdataiointe***ce_iid "com.dinglufe.rawdataiointe***ce"
q_declare_inte***ce(rawdataiointe***ce,rawdataiointe***ce_iid)
meshlab
工程是主窗體部分,也是整個工程的核心,負責介面和互動,其他的一些工程通重載入動態鏈結庫使用。比如可以載入io_rawdata.dll
使用rawdataiointe***ce
中宣告的testfunc
,測試**如下
#include #include #include void testrawdatafunc()
最後是io_rawdata
工程,這是乙個工程模組,這個模組負責io
相關的一些功能,比如讀取我們自己的檔案格式,同樣依賴於common
工程獲取相應的介面,然後實現其中宣告的功能,比如如下一段測試**
#include class rawdataio : public rawdataiointe***ce
int testfunc()
};
實現了rawdataiointe***ce
所宣告的testfunc
函式。
當然了,以上說的這些東西都只不過是qplugin
的使用簡介而已。關於**的組織,meshlab還有很多不錯的設計,可以去閱讀一下它的**。
從0開始學架構 推薦
程式設計師的成長繞不開架構設計,有時架構設計就像鴻溝一樣擋在程式設計師晉公升之路上,只要跨過去就可以海闊天空。但不少技術能力很強的程式設計師依然不能完全掌握架構設計,這與架構設計的思維方式和訓練機制與寫 有很大差異有關,加之人們對架構設計存在很多誤區,缺乏一套行之有效的架構設計方 就可能導致在實踐過...
學習 從0開始學架構 5
儲存高可用方案的本質都是通過將資料複製到多個儲存裝置,通過資料冗餘的方式來實現高可用,其複雜性主要體現在如何應對複製延遲和中斷導致的資料不一致問題 主備 讀寫主機,備機 主要還是起到乙個備份作用,並不承擔實際的業務讀寫操作 主從 主機讀寫,從機讀 雙機切換 狀態判斷 切換決策 中介式 主機和備機不再...
《從0開始學架構》 什麼是架構設計
本系列是極客時間 從0開始學架構 的讀書筆記。對應 01 架構到底是指什麼?架構是頂層設計 框架是面向程式設計或配置的半成品 元件是從技術維度上的復用 模組是從業務維度上職責的劃分 系統是相互協同可執行的實體。按照我的理解,架構的維度是最大的,一般我們會講業務架構和技術架構兩類。而框架重在提供一種約...