首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

Unix 動態庫建立全攻略:跨平台編譯鏈接實戰指南

     編輯:關於C語言

動態庫(Shared Library)是 Unix/Linux 系統上程式碼複用、模組化部署的核心機制。《精通 Unix 下 C 語言程式設計與專案實踐》詳細記錄了主流 Unix 平台建立動態庫的具體命令與差異。本文整理為速查手冊,並附帶完整實戰範例。

三步驟核心流程

  1. 設計庫原始碼
  2. 編譯位置無關碼(PIC)中間檔 .o
  3. 鏈接生成動態庫 .so(或 HP-UX 的 .sl)

關鍵編譯選項:-fpic/-KPIC(PIC)、-shared/-G(鏈接),不同平台編譯器參數不同。

範例原始碼

兩個同名函數/變數的來源檔,驗證動態載入時的符號隔離:

// d1.c
int p = 2;
void print() { printf("This is the first dll src!\n"); }

// d2.c
int p = 3;
void print() { printf("This is the second dll src!\n"); }

平台專屬編譯命令速查

SCO / Solaris (cc)

# 分步驟
cc -O -KPIC -c d1.c d2.c
cc -G -o d1.so d1.o
cc -G -o d2.so d2.o

# 一步到位
cc -O -KPIC -G -o d1.so d1.c
cc -O -KPIC -G -o d2.so d2.c

HP-UX (cc/ld)

cc +z -c d1.c d2.c
ld -b -o d1.so d1.o
ld -b -o d2.so d2.o
# 注意:HP-UX 預設擴展名為 .sl

AIX (xlc/ld)

xlc_r4 -c d1.c d2.c
ld -G -bnoentry -bexpall -lc d1.o -o d1.so
ld -G -bnoentry -bexpall -lc d2.o -o d2.so

Linux / GCC 體系

# 分步驟
gcc -fpic -c d1.c d2.c
gcc -shared -o d1.so d1.o
gcc -shared -o d2.so d2.o

# 一步到位
gcc -O -fpic -shared -o d1.so d1.c
gcc -O -fpic -shared -o d2.so d2.c
# 部分 GCC 版本支援 -G 替代 -shared

關鍵差異總結表

平台編譯器PIC 選項鏈接選項輸出擴展名
Solaris/SCOcc-KPIC-G.so
HP-UXcc/ld+zld -b.sl
AIXxlc/ld預設ld -G -bnoentry -bexpall.so
Linuxgcc-fpic-shared.so

實戰提醒

  • PIC 碼是動態庫基石,確保多進程共享同一份實體記憶體
  • 符號可見性控制(AIX 的 -bexpall)影響動態載入行為
  • 實際部署時需配合 LD_LIBRARY_PATH 或 /etc/ld.so.conf 設定搜尋路徑

掌握跨平台動態庫建置,是 Unix 系統程式開發者的必修課,亦是構建高可維護、可擴充系統的基石。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved