首先定義下模塊的概念,在C++中可以認(rèn)為每個(gè)二進(jìn)制文件為一個(gè)模塊。比如一個(gè)exe可執(zhí)行程序、一個(gè)dll或so動態(tài)庫。通常來說一個(gè)exe會依賴于幾個(gè)dll動態(tài)庫。
我們寫一個(gè)帶界面的聊天程序,exe為入口主程序 是主模塊,它可能依賴于QtWidgets QtCore等Qt模塊、libevent第三方模塊、我們自己寫的基礎(chǔ)庫xxbase模塊。
創(chuàng)新互聯(lián)建站2013年開創(chuàng)至今,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目成都網(wǎng)站設(shè)計(jì)、做網(wǎng)站、成都外貿(mào)網(wǎng)站建設(shè)公司網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢想脫穎而出為使命,1280元定安做網(wǎng)站,已為上家服務(wù),為定安各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話:13518219792
模塊自己內(nèi)部調(diào)用比較簡單,因?yàn)榫幾g環(huán)境和平臺都一致,不存在不兼容的問題。如果想把我們的功能提供給其他人使用,就需要導(dǎo)出接口和dll二進(jìn)制文件了。每種語言有自己的接口定義形式,接口在C或C++里就是一些.h頭文件。頭文件里定義了結(jié)構(gòu)體、函數(shù)等,供其他模塊調(diào)用。
也可以認(rèn)為模塊由接口和二進(jìn)制文件組成。windows編譯出來的dll肯定不能在linux上調(diào)用、32位編譯出的dll又不能被64位程序調(diào)用、Debug模式和Release模式也存在很多差異。C++不像Java,Java是編譯一次在任意操作系統(tǒng)和平臺都能跑起來。C++呢?不同操作系統(tǒng)、不同CPU、不同系統(tǒng)位數(shù)、甚至不同優(yōu)化參數(shù),編譯出來的二進(jìn)制文件都不通用。
動態(tài)庫就是編譯好的、可供其他模塊調(diào)用的二進(jìn)制文件。在windows是dll形式,在類Unix是so形式。
動態(tài)庫相比源碼和靜態(tài)庫有以下優(yōu)勢:
動態(tài)庫的劣勢:
“接口一經(jīng)發(fā)布,不允許做任何修改”這聽上去很難,其實(shí)是有辦法解決的。我們可以參考COM的思想,提供一個(gè)QueryInterface函數(shù),用以查詢所有接口。調(diào)用者先判斷這個(gè)接口是否存在,存在則調(diào)用、不存在則給出錯(cuò)誤提示。如果后期需要增加新接口,只需要更改下QueryInterface內(nèi)部實(shí)現(xiàn),就能擴(kuò)展新接口。
即使把現(xiàn)在所有能想到的功能都抽象成接口,也免不了后期增加新功能??梢蕴崆邦A(yù)留一些字段、函數(shù),或者設(shè)計(jì)成方便擴(kuò)展的形式。