精通Unix下C語言程式設計與專案實踐
之動態庫的生成
作者:朱雲翔,胡平
3.3 動態庫的生成
動態庫的生成可分為三個步驟,設計庫原始碼、編譯位置無關碼(PIC)型.o檔案和連結動態庫。連結動態庫的命令包含特殊標誌,與連結靜態庫和連結可執行目標檔案有區別,而且不同的Unix系統,其實現的細節也不盡相同。
編譯PIC型.o中間檔案的方法一般是採用C語言編譯器的“-KPIC”或者“-fpic”選項,有的Unix版本C語言編譯器預設帶上了PIC標誌。建立最終動態庫的方法一般是採用C語言編譯器的“-G”或者“-shared”選項,或者直接使用工具ld建立。
本處設計一個建立並呼叫動態庫的例子,分別將原始檔d1.c和d2.c編譯為動態庫d1.so和d2.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. Sco和Solaris系列
通過cc的“-KPIC”選項生成PIC中間檔案,再通過cc的“-G”選項鍊接成動態庫:
cc –O -KPIC -c d1.c d2.c /* 編譯以“.o”為副檔名的中間目標檔案d1.o和d2.o */
cc -G -o d1.so d1.o /* 根據中間目標檔案d1.o建立動態庫檔案d1.so */
cc -G -o d2.so d2.o /* 根據中間目標檔案d2.o建立動態庫檔案d2.so */
或者直接一步到位,直接建立動態庫檔案d1.so和d2.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.o和d2.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中,cc和xlc系列都是C語言編譯器。
xlc_r4 -c d1.c d2.c /* 編譯以“.o”為副檔名的中間目標檔案d1.o和d2.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標記的 erok、rtl、nortllib、nosymbolic、noautoexp 和 M:SRE選項,它將建立動態庫物件。更多的ld資訊請參考相關文件。
5. Linux和其他使用gcc編譯器的Unix
gcc -fpic -c d1.c d2.c /* 編譯以“.o”為副檔名的中間目標檔案d1.o和d2.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” 選項。
相關文章: