嵌入式或系統開發中,常需儲存簡單結構化資料。引入 MySQL 等重型資料庫屬大材小用,將資料序列化為二進位檔案(結構體直接讀寫)是輕量高效的選擇。為了複用,將讀寫介面封裝為函式庫是最佳實踐。
#ifndef OWNSTRUCT_H_
#define OWNSTRUCT_H_
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define FALSE 0
#define TRUE 1
int writeStruct(const char *fileName, char *buffer, int bufferLen, char *mode);
int readStruct(const char *fileName, char *buffer, int bufferLen, char *mode);
#endif
關鍵點:
goto 跳轉至清理標籤,確保檔案指標正確釋放。rewind 重置檔案位置指標。fwrite/fread 以結構體大小為單位操作。\0 確保字串安全。# 1. 編譯目標檔
gcc -c struct.c
# 2. 建立靜態庫(順序固定:cqs + 库名 + 目標檔)
ar cqs libstruct.a struct.o
# 3. 連結生成執行檔
gcc main.c -static -L. -lstruct -o main
特點:執行檔獨立,無外部依賴;但修改庫需重新編譯所有使用者,部署較繁瑣。
# 1. 編譯為位置無關碼並生成共享庫
gcc struct.c -fPIC -shared -o libstruct.so
# 2. 連結生成執行檔
gcc main.c -L. -lstruct -o main
# 3. 執行時期載入路徑設定(三種方式)
# 方式一:環境變數(永久)
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/path/to/lib
# 方式二:ld.so.conf + ldconfig(系統級)
echo "/path/to/lib" >> /etc/ld.so.conf && ldconfig
# 方式三:臨時指定(僅當前程序)
LD_LIBRARY_PATH=/path/to/lib ./main
特點:多程序共享單一庫實例,節省記憶體;升級庫無需重編應用;但部署需處理路徑問題。
| 參數 | 用途 |
|---|---|
-shared | 生成動態共享庫 |
-static | 靜態連結 |
-fPIC | 位置無關碼,共享庫必備 |
-L. | 指定庫搜尋路徑(當前目錄) |
-lname | 連結 libname.so/a,隱含命名規則 |
-Wall | 開啟所有警告 |
-g / -ggdb | 產生除錯資訊 |
-c | 僅編譯至目標檔 |
-Wl,options | 傳遞參數給連結器 ld |
libname.so.major.minor 慣例,配合 soname 機制平滑升級。-fvisibility=hidden + 屬性標註),減少命名衝突。掌握靜態/動態庫建置流程,是 C 程式設計師從「寫代碼」邁向「工程交付」的關鍵門檻。工具鏈參數看似繁瑣,實則邏輯自洽,熟練後將極大提升專案可維護性與部署彈性。