靜態函式庫(Static Library)是目標檔(.o)的封存檔(.a),連結時將程式碼複製進執行檔,優點:無執行期相依、保護原始碼、重新連結快。本文以 add() 函式為例示範完整流程。
/usr/lib, /lib,如 libc.a, libm.a-lname 對應 libname.a// tiger.h
#ifndef __TIGER__
#define __TIGER__
int add(int a, int b);
#endif
// tiger.c
int add(int a, int b) { return a + b; }
// main.c
#include <stdio.h>
#include "tiger.h"
int main() { printf("sum=%d\n", add(3,5)); return 0; }
# 1. 編譯目標檔
gcc -c tiger.c -o tiger.o
# 2. 封存為 .a
ar -rcs libadd.a tiger.o
# -r 插入/替換, -c 建立, -s 建立索引
# 方式一:直接指定 .a 路徑
gcc main.c libadd.a -o main
# 方式二:-l 連結(需 -L 指定搜尋目錄)
gcc main.c -L. -ladd -o main
# -L. 表示當前目錄
cannot find -ladd:未指定 -L 路徑或庫檔命名不符 lib*.a-o 必須置於 -l 之前,否則被誤認為輸出檔名#include "tiger.h" 仍需提供,編譯期檢查介面CC=gcc
AR=ar
CFLAGS=-Wall
TARGET=main
LIB=libadd.a
OBJS=tiger.o
all: $(TARGET)
$(LIB): $(OBJS)
$(AR) -rcs $@ $^
$(TARGET): main.c $(LIB)
$(CC) $(CFLAGS) -o $@ main.c -L. -ladd
clean:
rm -f *.o *.a $(TARGET)
掌握靜態庫建置流程,模組化開發與程式碼保護兩全其美。