精通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!\n");
}
程序pr2.c也提供了自己的函數print和變量p,如代碼3-5所示:
代碼3-5 動態庫源碼節自/code/chapter3/d2.c)
int p = 3;
void print()
{
printf("This is the second dll src!\n");
}
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” 選項。
相關文章:
封面 前言 目錄 策劃 作者
動態庫 變長參數 文件鎖
本文出自 “編程浪子朱雲翔” 博客,請務必保留此出處http://zhuyunxiang.blog.51cto.com/653596/128695