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


  靜態庫在程序編譯時會被連接到目標代碼中,程序運行時將不再需要該靜態庫。編譯之后程序文件大,但加載快,隔離性也好。

  動態庫在程序編譯時並不會被連接到目標代碼中,而是在程序運行時才被載入,因此在程序運行時還需要動態庫存在。多個應用程序可以使用同一個動態庫,啟動多個應用程序的時候,只需要將動態庫加載到內存一次即可。

編譯動態庫:

-shared:該選項指定生成動態連接庫(讓連接器生成T類型的導出符號表,有時候也生成弱連接W類型的導出符號),不用該標志外部程序無法連接。相當於一個可執行文件

-fPIC:表示編譯為位置獨立的代碼,不用此選項的話編譯后的代碼是位置相關的,所以動態載入時是通過代碼拷貝的方式來滿足不同進程的需要,而不能達到真正代碼段共享的目的。

-L:表示要連接的庫在當前目錄中

-ltest:編譯器查找動態鏈接庫時有隱含的命名規則,則在給出的名字前面加上lib,后面加上.so來確定庫的名稱

 

配置動態庫位置:

LD_LIBRARY_PATH:這個環境變量指示動態連接器可以裝載動態庫的路徑。

查看:可以通過env查看LD_LIBRARY_PATH內的值。

修改:

  1. export LD_LIBRARY_PATH=LD_LIBRARY_PATH:/XXX但是登出后就失效
  2. 修改~/.bashrc或~/.bash_profile;在其中末尾添加例如export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/mysql/lib 然后執行source .bashrc(.bash_profile)
  3. 同方法2 可以修改 /etc/profile;在末尾添加export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/mysql/lib 然后執行source /etc/profile
  4. 不修改LD_LIBRARY_PATH 但是效果是一樣的(實現動態庫的查找);在/etc/ld.so.conf下面加一行/usr/local/mysql/lib,保存后ldconfig一下 ldconfig /usr/local/mysql/lib

 


免責聲明!

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



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