動態鏈結庫(Dynamic Linked Library, DDL)#
- 將程式中重複引用的程式庫獨立包裝出來以便共同引用
- 好處是比起靜態庫更節省空間
- 也可以單獨修改動態庫文件
// math.c
int add(int a, int b)
{
return a + b;
}
// 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
// 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
系統在路徑下找不到文件的解決方案#
- 將動態庫複製到系統路徑下(需要 root 權限)
$ sudo ^C cp libmath.so /usr/local/lib/
- 使用環境變量,將當前目錄加到
LD_LIBRARY_PATH
環境變量中
$ export LD_LIBRARY_PATH="$(pwd)" // 將當前目錄叫到 LD_LIBRARY_PATH中
$ echo $LD_LIBRARY_PATH // 測試是否調用成功