靜態庫在程序編譯時會被連接到目標代碼中,程序運行時將不再需要該靜態庫。編譯之后程序文件大,但加載快,隔離性也好。
動態庫在程序編譯時並不會被連接到目標代碼中,而是在程序運行時才被載入,因此在程序運行時還需要動態庫存在。多個應用程序可以使用同一個動態庫,啟動多個應用程序的時候,只需要將動態庫加載到內存一次即可。
編譯動態庫:
-shared:該選項指定生成動態連接庫(讓連接器生成T類型的導出符號表,有時候也生成弱連接W類型的導出符號),不用該標志外部程序無法連接。相當於一個可執行文件
-fPIC:表示編譯為位置獨立的代碼,不用此選項的話編譯后的代碼是位置相關的,所以動態載入時是通過代碼拷貝的方式來滿足不同進程的需要,而不能達到真正代碼段共享的目的。
-L:表示要連接的庫在當前目錄中
-ltest:編譯器查找動態鏈接庫時有隱含的命名規則,則在給出的名字前面加上lib,后面加上.so來確定庫的名稱
配置動態庫位置:
LD_LIBRARY_PATH:這個環境變量指示動態連接器可以裝載動態庫的路徑。
查看:可以通過env查看LD_LIBRARY_PATH內的值。
修改:
- export LD_LIBRARY_PATH=LD_LIBRARY_PATH:/XXX但是登出后就失效
- 修改~/.bashrc或~/.bash_profile;在其中末尾添加例如export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/mysql/lib 然后執行source .bashrc(.bash_profile)
- 同方法2 可以修改 /etc/profile;在末尾添加export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/mysql/lib 然后執行source /etc/profile
- 不修改LD_LIBRARY_PATH 但是效果是一樣的(實現動態庫的查找);在/etc/ld.so.conf下面加一行/usr/local/mysql/lib,保存后ldconfig一下 ldconfig /usr/local/mysql/lib