精通Unix下C語言程式設計與專案實踐

之動態庫的生成

作者:朱雲翔,胡平 

3.3 動態庫的生成

動態庫的生成可分為三個步驟,設計庫原始碼、編譯位置無關碼(PIC)型.o檔案和連結動態庫。連結動態庫的命令包含特殊標誌,與連結靜態庫和連結可執行目標檔案有區別,而且不同的Unix系統,其實現的細節也不盡相同。

編譯PIC.o中間檔案的方法一般是採用C語言編譯器的“-KPIC”或者“-fpic”選項,有的Unix版本C語言編譯器預設帶上了PIC標誌。建立最終動態庫的方法一般是採用C語言編譯器的“-G”或者“-shared”選項,或者直接使用工具ld建立。

本處設計一個建立並呼叫動態庫的例子,分別將原始檔d1.cd2.c編譯為動態庫d1.sod2.so,並在主程式中呼叫之。

1. 設計庫原始碼

程式pr1.c提供了函式print和變數p,如程式碼3-4所示:

程式碼3-4 動態庫原始碼(節自/code/chapter3/d1.c

int p = 2;

void print()

{

        printf(“This is the first dll src!
“);

}

程式pr2.c也提供了自己的函式print和變數p,如程式碼3-5所示:

程式碼3-5 動態庫原始碼(節自/code/chapter3/d2.c

int p = 3;

void print()

{

        printf(“This is the second dll src!
“);

}

2. ScoSolaris系列

    通過cc的“-KPIC”選項生成PIC中間檔案,再通過cc的“-G”選項鍊接成動態庫:

cc –O -KPIC -c d1.c d2.c    /* 編譯以“.o”為副檔名的中間目標檔案d1.od2.o */

cc -G -o d1.so d1.o     /* 根據中間目標檔案d1.o建立動態庫檔案d1.so */

cc -G -o d2.so d2.o     /* 根據中間目標檔案d2.o建立動態庫檔案d2.so */

或者直接一步到位,直接建立動態庫檔案d1.sod2.so

cc -O -KPIC -G -o d1.so d1.c                    /* 建立動態庫檔案d1.so */

cc -O -KPIC -G -o d2.so d2.c                    /* 建立動態庫檔案d2.so */

3. HP-UNIX系列

建立 PIC 中間檔案的編譯器選項是+z,建立動態庫的連結器標誌是-b

cc +z -c d1.c d2.c      /* 編譯以“.o”為副檔名的中間目標檔案d1.od2.o */

ld -b -o d1.so d1.o     /* 根據中間目標檔案d1.o建立動態庫檔案d1.so */

ld -b -o d2.so d2.o     /* 根據中間目標檔案d2.o建立動態庫檔案d2.so */

與大部分系統不同的是,HP-UNIX預設使用“.sl”做動態庫的副檔名。

4. AIX系列

AIX中,ccxlc系列都是C語言編譯器。

xlc_r4 -c d1.c d2.c     /* 編譯以“.o”為副檔名的中間目標檔案d1.od2.o */

ld -G -bnoentry -bexpall -lc d1.o -o d1.so  /* 建立動態庫檔案d1.so */

ld -G -bnoentry -bexpall -lc d2.o -o d2.so  /* 建立動態庫檔案d2.so */

ld是建立動態庫的工具,它的常用選項與cc類似,比如“-l”標識連結庫,“-o”標識目標檔名稱等。本處“-G”選項等價於指定帶有-b標記的 erokrtlnortllibnosymbolicnoautoexp M:SRE選項,它將建立動態庫物件。更多的ld資訊請參考相關文件。

5. Linux和其他使用gcc編譯器的Unix

gcc -fpic -c d1.c d2.c  /* 編譯以“.o”為副檔名的中間目標檔案d1.od2.o */

gcc -shared -o d1.so d1.o   /* 根據中間目標檔案d1.o建立動態庫檔案d1.so */

gcc -shared -o d2.so d2.o   /* 根據中間目標檔案d2.o建立動態庫檔案d2.so */

或者直接一步到位:

gcc -O -fpic -shared -o d1.so d1.c          /* 建立動態庫檔案d1.so */

gcc -O -fpic -shared -o d2.so d2.c          /* 建立動態庫檔案d2.so */

某些版本的gcc上也可以使用“-G”替換“-shared 選項。
 
相關文章:
封面          前言        目錄         策劃         作者
動態庫        變長引數    檔案鎖