1. 程式人生 > >程式顯式呼叫和隱式呼叫linux動態連結庫(*.so)的區別。

程式顯式呼叫和隱式呼叫linux動態連結庫(*.so)的區別。

        我們知道,動態庫相比靜態庫的區別是:靜態庫是編譯時就載入到可執行檔案中的,而動態庫是在程式執行時完成載入的,所以使用動態庫的程式的體積要比使用靜態庫程式的體積小,並且使用動態庫的程式在執行時必須依賴所使用的動態庫檔案(.so檔案),而使用靜態庫的程式一旦編譯好,就不再需要依賴的靜態庫檔案了(.a檔案)。

        動態庫的呼叫又分為顯示和隱式兩種方式,

一、隱式呼叫就是編譯程式的時候,包含動態庫的標頭檔案,並且指明動態庫的名字和位置。

二、顯示呼叫就是在程式執行過程中dlopen動態庫,然後通過dlsym獲取動態庫裡函式的地址。 

區別如下:

        1、 隱式呼叫需要呼叫者寫的程式碼量少,呼叫起來和使用當前專案下的函式一樣直接;而顯式呼叫則要求程式設計師在呼叫時,指明要載入的動態庫的名稱和要呼叫的函式名稱。

        2、隱式呼叫由系統載入完成,對程式設計師透明;顯式呼叫由程式設計師在需要使用時自己載入,不再使用時,自己負責解除安裝。

        3、由於顯式呼叫由程式設計師負責載入和解除安裝,好比動態申請記憶體空間,需要時就申請,不用時立即釋放,因此顯式呼叫對記憶體的使用更加合理, 大型專案中應使用顯示呼叫。

        4、當動態連結庫中只提供函式介面,而該函式沒有封裝到類裡面時,如果使用顯式呼叫的方式,呼叫方甚至不需要包含動態連結庫的標頭檔案(需要呼叫的函式名是通過dlsym函式的引數指明的),而使用隱式呼叫時,則呼叫方不可避免要加上動態庫中的標頭檔案,g++編譯時還需要要用引數-I指明包含的標頭檔案的位置。需要注意的是,當動態連結庫中的介面函式是作為成員函式封裝在類裡面時,即使使用顯式呼叫的方式,呼叫方也必須包含動態庫中的相應標頭檔案。

        5、顯式呼叫更加靈活,可以模擬多型效果。

轉自:http://blog.csdn.net/lc_910927/article/details/42393121