1. 程式人生 > >linux中動態庫libXXX.so

linux中動態庫libXXX.so

擴展 普通 ros 鏈接 好的 命令執行 win 程序 pen

1、動態庫的概念。動態鏈接庫與普通的程序相比而言,沒有main函數,是一系列函數的實現。通過shared和fPIC編譯參數生產so動態鏈接庫文件。程序在調用庫函數時,只需要連接上這個庫即可。

2、動態庫的優點可以實現進程之間的資源共享。就是說,某個程序的在運行中要調用某個動態鏈接庫函數的時候,操作系統首先會查看所有正在運行的程序,看在內存裏是否已有此庫函數的拷貝了。如果有,則讓其共享那一個拷貝;只有沒有才鏈接載入。這樣的模式雖然會帶來一些“動態鏈接”額外的開銷,卻大大的節省了系統的內存資源。C的標準庫就是動態鏈接庫,也就是說系統中所有運行的程序共享著同一個C標準庫的代碼段。將一些程序升級變得簡單

。用戶只需要升級動態鏈接庫,而無需重新編譯鏈接其他原有的代碼就可以完成整個程序的升級。Windows 就是一個很好的例子。甚至可以真正坐到鏈接載入完全由程序員在程序代碼中控制。 程序員在編寫程序的時候,可以明確的指明什麽時候或者什麽情況下,鏈接載入哪個動態鏈接庫函數。你可以有一個相當大的軟件,但每次運行的時候,由於不同的操作需求,只有一小部分程序被載入內存。所有的函數本著“有需求才調入”的原則,於是大大節省了系統資源。比如現在的軟件通常都能打開若幹種不同類型的文件,這些讀寫操作通常都用動態鏈接庫來實現。在一次運行當中,一般只有一種類型的文件將會被打開。所以直到程序知道文件的類型以後再載入相應的讀寫函數,而不是一開始就將所有的讀寫函數都載入,然後才發覺在整個程序中根本沒有用到它們

3、動態庫的創建。例如下面實現一個簡單的整數四則運輸的動態鏈接庫,定義的caculate.h和caculate.c兩個文件,生產libcac.so動態鏈接庫。

技術分享圖片

技術分享圖片

技術分享圖片

4、動態庫的使用。編寫一個測試程序main.c調用此動態鏈接庫的函數。編譯生產可執行文件main如下:gcc main.c -o main -L ./ -lcac (其中-L指明動態鏈接庫的路徑,-l後是鏈接庫的名稱,省略lib)。

技術分享圖片

技術分享圖片

5、獲取動態鏈接庫的函數。linux提供dlopen、dlsym、dlerror和dlcolose函數獲取動態鏈接庫的函數。通過這個四個函數可以實現一個插件程序,方便程序的擴展和維護。函數格式如下所示。

技術分享圖片

dlopen()是一個強大的庫函數。該函數將打開一個新庫,並把它裝入內存。該函數主要用來加載庫中的符號,這些符號在編譯的時候是不知道的。寫個測試程序調用上面生產libcac.so庫如下所示。

技術分享圖片

技術分享圖片

6、獲取某個命令執行時需要依賴哪些動態庫,如果有依賴庫找不到,那麽程序會無法正常運行。

# ldd 命令的絕對路徑

技術分享圖片

3、動態庫的創建。

linux中動態庫libXXX.so