Linux下動態庫(.so)和靜態庫(.a) 的區別


靜態庫在程序編譯時會被連接到目標代碼中,程序運行時將不再需要該靜態庫。編譯之后程序文件大,但加載快,隔離性也好。
動態庫在程序編譯時並不會被連接到目標代碼中,而是在程序運行是才被載入,因此在程序運行時還需要動態庫存在。多個應用程序可以使用同一個動態庫,啟動多個應用程序的時候,只需要將動態庫加載到內存一次即可。

 

編譯動態庫:

-shared 該選項指定生成動態連接庫(讓連接器生成T類型的導出符號表,有時候也生成弱連接W類型的導出符號),不用該標志外部程序無法連接。相當於一個可執行文件
-fPIC:表示編譯為位置獨立的代碼,不用此選項的話編譯后的代碼是位置相關的所以動態載入時是通過代碼拷貝的方式來滿足不同進程的需要,而不能達到真正代碼段共享的目的。
-L.:表示要連接的庫在當前目錄中
-ltest:編譯器查找動態連接庫時有隱含的命名規則,即在給出的名字前面加上lib,后面加上.so來確定庫的名稱

 

配置庫位置:
LD_LIBRARY_PATH:這個環境變量指示動態連接器可以裝載動態庫的路徑。
當然如果有root權限的話,可以修改/etc/ld.so.conf文件,然后調用 /sbin/ldconfig來達到同樣的目的,不過如果沒有root權限,那么只能采用輸出LD_LIBRARY_PATH的方法了。

ldd命令可以查看可執行文件依賴的庫文件。

1 root@xxj-VirtualBox:~/interview# ldd gmedian
2     linux-vdso.so.1 =>  (0x00007fff88c71000)
3     libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f4013945000)
4     libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f401372f000)
5     libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f4013368000)
6     libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f4013062000)
7     /lib64/ld-linux-x86-64.so.2 (0x00007f4013c5f000)

 


免責聲明!

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



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