動態鏈結庫(Dynamic Linked Library, DDL)

  • 將程式中重複引用的程式庫獨立包裝出來以便共同引用
  • 好處是比起靜態庫更節省空間
  • 也可以單獨修改動態庫文件

示例

  • 創建一個自定義程式庫 math.c
// math.c
int add(int a, int b)
{
    return a + b;
}
  • 建建一個 math.h 只包含函式的宣告
// math.h
int add(int a, int b);
  • 將 math.c 編譯成一個動態庫
    • -shared 表明是一個 shared library
    • .so 是 Linux 下的動態庫的副檔名,Windows 下為 .dll
$ gcc -shared -fPIC math.c -o libmath.so
  • 在主程式中包含 math.h 頭文件
// main.c
#include <stdio.h>
#include <math.h>

int main()
{
    printf("add(1, 2) returns %d\n", add(1, 2));
    return 0;
}
  • 利用 -l 編譯主程式
    • 省略 libmath.so 中的 lib.so-lmath
gcc main.c -lmath -L. -o main

系統在路徑下找不到文件的解決方案

  1. 將動態庫複製到系統路徑下(需要 root 權限)
$ sudo ^C cp libmath.so /usr/local/lib/
  1. 使用環境變量,將當前目錄加到 LD_LIBRARY_PATH 環境變量中
$ export LD_LIBRARY_PATH="$(pwd)"       // 將當前目錄叫到 LD_LIBRARY_PATH中
$ echo $LD_LIBRARY_PATH                 // 測試是否調用成功