Linux下程序運行中,有兩種庫,靜態庫和動態庫。
靜態庫:名字一般為libxxx.a,編譯時會整合到可執行程序中,優點是運行時不需要外部函數庫支持,缺點是編譯后程序較大,一旦靜態庫改變,程序需要重新編譯。
動態庫:名字一般為libxxx.M.N.so,M為主版本號,N為副版本號。優點是運行時,有需要時才動態調用外部庫中的函數,節省空間,缺點是運行環境中必須提供相應的庫,動態庫更新升級方便。
靜態庫的制作和使用
動態庫的制作和使用
動態庫的后綴為.so,一般存放在/lib, /usr/lib等目錄下,可以使用ldd工具來查看一個可執行程序使用了哪些動態庫,見下圖:
可以看到,我們常用的ls命令使用的動態庫位於/lib/i386-linux-gnu/目錄下。
動態鏈接是由操作系統運行程序時調用的,既然是程序,那按照Linux的風格,肯定有對於的配置文件來設置,動態鏈接庫的配置文件位於/etc/ld.so.conf,具體內容如下:
從上圖可以知道,系統搜索動態鏈接庫的路徑位於特定的目錄。Linux系統為了提高動態鏈接庫的運行性能,把一些常用的動態鏈接庫放在/etc/ld.so.cache這個文件中去。如何更新這個動態鏈接庫的緩存文件呢?Linux提供了ldconfig命令來更新,這個命令主要搜索/lib和/usr/lib以及配置文件ld.so.conf.d/目錄下的可用的動態鏈接庫文件,然后重新創建新的動態鏈接程序/lib/ld-linux.so.2所需的連接和更新動態鏈接庫緩存文件ld.so.cache.
ldconfig –p | head or grep XX : 查看系統中有哪些動態鏈接庫
ldconfig –v 輸出動態鏈接庫掃描目錄並且刷新ld.so.cache緩存
執行ldconfig需要root權限。
既然是動態鏈接庫,那就是需要開發出來給其他人使用的。按照C語言的風格,h頭文件提供函數庫的接口說明,就像stdio.h頭文件一樣,我們用到的輸入輸出,都必須包含這個頭文件。要使用我們自己的動態鏈接庫,那就要包含動態鏈接庫提供的頭文件。
然后是編譯生成動態鏈接庫
使用動態鏈接庫
如果是在團隊開發過程中,建議將動態鏈接庫放在/lib或則/usr/lib,或者自定義的/usr/local/lib/目錄下,然后將庫路徑添加到自己庫的配置文件mytest.conf,將此配置文件拷貝到/etc/ld.so.conf.d/目錄下,執行ldconfig就可以。
動態鏈接庫的動態加載方式
Linux提供了一套API用於動態加載動態鏈接庫,更加靈活的使用動態鏈接庫,詳細代碼和注釋如下:
編譯后執行:
注意事項:
在使用動態執行動態鏈接庫時,可執行程序需要添加 dlfcn.h頭文件
在編譯時,需要增加 –rdynamic –ldl 這兩個參數,產生可以調用動態鏈接庫的執行代碼。
參考鏈接: