靜態連結(Static Linking)與動態連結(Dynamic Linking)
靜態連結(Static Linking)
定義:在編譯時期將所有需要的程式庫整合到最終的可執行文件中。
示例:
bash
複製程式碼
gcc -o myprogram main.c libmath.a
優點:
自包含:可執行文件包含所有需要的程式碼,獨立於外部程式庫。
執行速度快:不需要在運行時期解析外部程式庫的地址。
部署簡單:不依賴於外部程式庫的版本。
缺點:
文件體積大:包含所有程式庫的副本,增加了文件大小。
更新困難:需要重新編譯所有使用該程式庫的可執行文件。
重複:不同的可執行文件可能包含相同的程式庫代碼,浪費空間。
動態連結(Dynamic Linking)
定義:在運行時期將程式庫載入到內存中並連結到程式中。
示例:
bash
複製程式碼
gcc -o myprogram main.c -lmath
優點:
文件體積小:可執行文件不包含程式庫的副本。
易於更新:可以單獨更新程式庫而無需重新編譯可執行文件。
共用程式庫:多個應用程序可以共用同一個動態程式庫,節省空間。
缺點:
依賴性:需要在運行環境中確保存在所需的程式庫。
啟動時間稍長:在運行時期需要解析和載入程式庫,可能稍微增加啟動時間。
版本衝突:不同的應用程序可能需要不同版本的程式庫。
程式庫的產生與使用
產生靜態程式庫
創建靜態程式庫文件:
bash
複製程式碼
gcc -c add.c subtract.c
ar rcs libmath.a add.o subtract.o
使用靜態程式庫:
bash
複製程式碼
gcc -o myprogram main.c libmath.a
產生動態程式庫
創建動態程式庫文件:
bash
複製程式碼
gcc -fPIC -c add.c subtract.c
gcc -shared -o libmath.so add.o subtract.o
使用動態程式庫:
bash
複製程式碼
gcc -o myprogram main.c -L. -lmath
並確保 libmath.so 在運行時期可被找到,如設置 LD_LIBRARY_PATH 環境變量。