Linux下建立動態庫
阿新 • • 發佈:2019-02-03
動態庫簡介
在Linux下動態庫檔案字尾為.so
, 其中so代表 Shared Object,即共享目標檔案。
動態庫的特點就是在系統記憶體中,只會存在動態庫的一個副本。例如:程式A,B允許時都需要動態庫lib.so
的支援。當A程式執行時,由於系統記憶體中沒有發現lib.so
庫,所以需要載入lib.so
。此時B程式執行,發現系統記憶體中已經存在lib.so
,所以不需要載入lib.so
。可以認為可執行程式並沒包含動態庫的程式碼,只是包含了對動態庫的引用。
編譯動態庫的步驟
- 編寫原始檔
- 編譯生成動態庫
- 使用庫
先通過一個小例子來生成一個動態庫:
編寫原始檔
- 建立libadd.so要用到的add.c
// add.c
#include <stdio.h>
#include "add.h"
int add(int a, int b){
return (a + b);
}
- 建立libadd.so的介面檔案add.h
// add.h
#ifndef ADD_H
#define ADD_H
int add(int a, int b);
#endif
編譯生成動態庫
- 編譯命令
gcc -fPIC -shared -c add.c -o libadd.so
至此將會在當前目錄下生成libadd.so
動態庫檔案。下面來解釋一下生成動態庫的各個引數:
-fPIC
中的PIC(position-independent code),意指位置無關的程式碼。該選項告訴編譯器編譯生成位置無關的目標檔案。
-shared
該選項屬於連結選項,產生一個共享的目標檔案。該引數必須和-fPIC或-fpic一起使用。
使用庫
- 編寫使用程式碼
// main.c
#include <stdio.h>
#include "add.h"
int main(){
printf("%d\n", add(1, 2));
return 0
}
- 編譯main.c的命令
gcc -o main -L. -ladd
至此生成以來動態庫libadd.so
main
,執行main程式就能看到結果為3。
編譯選項解釋:
-llibrary
-l選項後面跟庫名(注意庫名指的是lib
和.so
中間的部分,例如libadd.so的庫名是add),該選項是告訴gcc要連結add庫。
-Ldir
新增一條搜尋-llibrary
中的library的路徑。dir為library庫所在的目錄。