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

C 語言靜態庫建立與使用完整指南

     編輯:關於C

從原始碼到靜態庫的完整流程

靜態庫(Static Library)將多個目標檔打包成單一 .a 檔案,連結時僅提取所需符號,減少執行檔體積並簡化建置指令。本文以堆疊模組為例,示範從原始碼拆分、編譯、打包到連結的完整步驟。

專案結構與原始碼拆分

.
├── main.c
└── stack/
    ├── stack.c      // 全域資料:stack[512], top
    ├── push.c       // push() 實作
    ├── pop.c        // pop() 實作
    ├── is_empty.c   // is_empty() 實作
    └── stack.h      // 介面宣告

編譯目標檔與建立靜態庫

# 編譯各模組產生 .o 檔
gcc -c stack/stack.c stack/push.c stack/pop.c stack/is_empty.c

# 使用 ar 打包並建立索引
ar rs libstack.a stack.o push.o pop.o is_empty.o
# 等同於
ar r libstack.a stack.o push.o pop.o is_empty.o
ranlib libstack.a
  • r:插入/取代目標檔;s:建立符號索引供連結器快速查找。
  • 慣例命名 lib<name>.a。

連結靜態庫產生執行檔

gcc main.c -L. -lstack -Istack -o main
  • -L. 指定庫搜尋路徑為當前目錄(必要)。
  • -lstack 連結 libstack.a(編譯器優先找 .so,再找 .a)。
  • -Istack 指定標頭檔搜尋路徑。

靜態庫 vs 動態庫差異

驗證連結結果

objdump -d main | grep -A5 "<push>"
# 僅出現 push,pop 與 is_empty 未被連結

靜態庫適合輸出檔案獨立部署、跨專案共用核心模組的場景,是 C/C++ 專案模組化的基礎技能。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
特性靜態庫 (.a)動態庫 (.so)
連結階段將目標檔複製進執行檔僅記錄庫名與路徑
執行檔大小較大較小
執行時依賴無需動態連結器載入
符號解析連結時完成載入時/執行時完成
未使用函數不會被連結整個庫皆載入