1. 程式人生 > >Linux下建立動態庫

Linux下建立動態庫

動態庫簡介

在Linux下動態庫檔案字尾為.so, 其中so代表 Shared Object,即共享目標檔案。

動態庫的特點就是在系統記憶體中,只會存在動態庫的一個副本。例如:程式A,B允許時都需要動態庫lib.so的支援。當A程式執行時,由於系統記憶體中沒有發現lib.so庫,所以需要載入lib.so。此時B程式執行,發現系統記憶體中已經存在lib.so,所以不需要載入lib.so。可以認為可執行程式並沒包含動態庫的程式碼,只是包含了對動態庫的引用。

編譯動態庫的步驟

  1. 編寫原始檔
  2. 編譯生成動態庫
  3. 使用庫

先通過一個小例子來生成一個動態庫:

編寫原始檔

  • 建立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庫所在的目錄。