Linux 靜態庫和動態庫 使用說明


    Linux下程序運行中,有兩種庫,靜態庫和動態庫。

    靜態庫:名字一般為libxxx.a,編譯時會整合到可執行程序中,優點是運行時不需要外部函數庫支持,缺點是編譯后程序較大,一旦靜態庫改變,程序需要重新編譯。

    動態庫:名字一般為libxxx.M.N.so,M為主版本號,N為副版本號。優點是運行時,有需要時才動態調用外部庫中的函數,節省空間,缺點是運行環境中必須提供相應的庫,動態庫更新升級方便。

  靜態庫的制作和使用

     image

image

動態庫的制作和使用

動態庫的后綴為.so,一般存放在/lib, /usr/lib等目錄下,可以使用ldd工具來查看一個可執行程序使用了哪些動態庫,見下圖:

image

可以看到,我們常用的ls命令使用的動態庫位於/lib/i386-linux-gnu/目錄下。

動態鏈接是由操作系統運行程序時調用的,既然是程序,那按照Linux的風格,肯定有對於的配置文件來設置,動態鏈接庫的配置文件位於/etc/ld.so.conf,具體內容如下:

image

從上圖可以知道,系統搜索動態鏈接庫的路徑位於特定的目錄。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頭文件一樣,我們用到的輸入輸出,都必須包含這個頭文件。要使用我們自己的動態鏈接庫,那就要包含動態鏈接庫提供的頭文件。

image

然后是編譯生成動態鏈接庫

   image

使用動態鏈接庫

  image

如果是在團隊開發過程中,建議將動態鏈接庫放在/lib或則/usr/lib,或者自定義的/usr/local/lib/目錄下,然后將庫路徑添加到自己庫的配置文件mytest.conf,將此配置文件拷貝到/etc/ld.so.conf.d/目錄下,執行ldconfig就可以。

  動態鏈接庫的動態加載方式

    Linux提供了一套API用於動態加載動態鏈接庫,更加靈活的使用動態鏈接庫,詳細代碼和注釋如下:

image 

編譯后執行:

image

注意事項:

        在使用動態執行動態鏈接庫時,可執行程序需要添加 dlfcn.h頭文件

        在編譯時,需要增加 –rdynamic –ldl 這兩個參數,產生可以調用動態鏈接庫的執行代碼。

Technorati 標簽: 動態庫 靜態庫

 

參考鏈接:

http://blog.chinaunix.net/uid-23069658-id-3142046.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM