靜態庫在程序編譯時會被連接到目標代碼中,程序運行時將不再需要該靜態庫。編譯之后程序文件大,但加載快,隔離性也好。 動態庫在程序編譯時並不會被連接到目標代碼中,而是在程序運行是才被載入,因此在程序運行時還需要動態庫存在。多個應用程序可以使用同一個動態庫,啟動多個應用程序的時候,只需要將動態庫加載到內存一次即可。
編譯動態庫:
-shared 該選項指定生成動態連接庫(讓連接器生成T類型的導出符號表,有時候也生成弱連接W類型的導出符號),不用該標志外部程序無法連接。相當於一個可執行文件 -fPIC:表示編譯為位置獨立的代碼,不用此選項的話編譯后的代碼是位置相關的所以動態載入時是通過代碼拷貝的方式來滿足不同進程的需要,而不能達到真正代碼段共享的目的。 -L.:表示要連接的庫在當前目錄中 -ltest:編譯器查找動態連接庫時有隱含的命名規則,即在給出的名字前面加上lib,后面加上.so來確定庫的名稱
配置庫位置: LD_LIBRARY_PATH:這個環境變量指示動態連接器可以裝載動態庫的路徑。 當然如果有root權限的話,可以修改/etc/ld.so.conf文件,然后調用 /sbin/ldconfig來達到同樣的目的,不過如果沒有root權限,那么只能采用輸出LD_LIBRARY_PATH的方法了。
ldd命令可以查看可執行文件依賴的庫文件。
root@xxj-VirtualBox:~/interview# ldd gmedian
linux-vdso.so.1 => (0x00007fff88c71000)
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f4013945000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f401372f000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f4013368000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f4013062000)
/lib64/ld-linux-x86-64.so.2 (0x00007f4013c5f000)
#include <stdio.h>const char* sz_static = "i'm a static str.";void print_niuzai_said() { printf("in static lib, niu zai said, i'm happy!\n"); }
#include <stdio.h> #include "static.h"void print_papa_said() { print_niuzai_said(); printf("in dynamic lib, papa said, niu zai is wonderful!\n"); }
#include <unistd.h> #include "dynamic.h"int main(int argc, char** argv) { print_papa_said(); return 0; }
