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

SQLite C/C++ 嵌入式開發實戰:32/64 位編譯與 API 核心流程

     編輯:關於SqlServer

將 SQLite 靜態/動態連結進 C/C++ 專案的完整指南

SQLite 以單一 sqlite3.c + sqlite3.h 發布,嵌入專案極簡單,但 32/64 位 DLL/Import Library 生成常卡住新手。本文涵蓋 Windows 下 Visual Studio 專案整合、Linux/macOS 編譯、核心 API 流程與防注入最佳實務。

一、Windows 32 位專案:使用預編譯 DLL + Import Library

  1. 官網下載 sqlite-dll-win32-x86-*.zip 解壓得 sqlite3.dll、sqlite3.def。
  2. Visual Studio Developer Command Prompt 執行:
    lib.exe /MACHINE:X86 /DEF:sqlite3.def /OUT:sqlite3.lib
    產生 sqlite3.lib (Import Library) 與 sqlite3.exp。
  3. 專案屬性 → 連結器 → 輸入 → 額外相依性 加入 sqlite3.lib;C/C++ → 一般 → 額外包含目錄 加入標頭檔目錄。
  4. 程式碼:
    #include "sqlite3.h"
    #pragma comment(lib, "sqlite3.lib")  // MSVC 自動連結
  5. 執行時將 sqlite3.dll 放在 .exe 同目錄或 PATH 目錄。

二、Windows 64 位專案:直接編譯原始碼(官方建議)

官方不提供 64 位預編譯 DLL,最穩定做法:

  1. 下載 sqlite-amalgamation-*.zip(含 sqlite3.c、sqlite3.h、sqlite3ext.h)。
  2. 將 sqlite3.c、sqlite3.h 加入專案(或建立靜態庫專案單獨編譯)。
  3. 編譯選項建議加入:
    DSQLITE_THREADSAFE=1
    DSQLITE_DEFAULT_MEMSTATUS=0
    DSQLITE_MAX_MMAP_SIZE=0x7FFFFFFF
  4. 專案平台設為 x64,直接編譯連結,無需外部 DLL。

三、Linux / macOS:系統庫或原始碼編譯

# Ubuntu/Debian
sudo apt-get install libsqlite3-dev
# 編譯
gcc main.c -lsqlite3 -o myapp

# 靜態連結(嵌入式裝置常用)
wget https://sqlite.org/2024/sqlite-amalgamation-3450000.zip
unzip ... && gcc sqlite3.c main.c -o myapp -lpthread -ldl

四、核心 API 呼叫流程(必背六步曲)

sqlite3 *db;
int rc = sqlite3_open("mydb.db", &db);          // 1. 開啟/建立
if (rc) { fprintf(stderr, "%s\n", sqlite3_errmsg(db)); return 1; }

const char *sql = "CREATE TABLE IF NOT EXISTS t(id INTEGER PRIMARY KEY, v TEXT);";
rc = sqlite3_exec(db, sql, 0, 0, 0);            // 2. 簡單 SQL (無結果集)
if (rc != SQLITE_OK) { /* 錯誤處理 */ }

// 3. 準備參數化查詢
sqlite3_stmt *stmt;
sqlite3_prepare_v2(db, "INSERT INTO t(v) VALUES (?);", -1, &stmt, 0);
sqlite3_bind_text(stmt, 1, "hello", -1, SQLITE_TRANSIENT);  // 4. 綁定
sqlite3_step(stmt);                               // 5. 執行
sqlite3_finalize(stmt);                           // 6. 釋放 Statement

// 查詢範例
sqlite3_prepare_v2(db, "SELECT v FROM t WHERE id = ?;", -1, &stmt, 0);
sqlite3_bind_int(stmt, 1, 1);
while (sqlite3_step(stmt) == SQLITE_ROW) {
    const unsigned char *v = sqlite3_column_text(stmt, 0);
    printf("%s\n", v);
}
sqlite3_finalize(stmt);
sqlite3_close(db);

五、關鍵最佳實務

  • 永遠使用參數化查詢 (sqlite3_bind_*),**嚴禁字串拼接 SQL** 防注入。
  • WAL 模式:sqlite3_exec(db, "PRAGMA journal_mode=WAL;", 0, 0, 0); 讀寫並行、抗崩潰。
  • 交易批次:大量寫入前 BEGIN;、後 COMMIT;,速度提升 100 倍+。
  • 錯誤碼檢查:所有 API 回傳 SQLITE_OK (0) 表示成功,否則用 sqlite3_errmsg(db) 取得訊息。
  • 記憶體管理:sqlite3_column_text 回傳指標屬於 SQLite 內部,下一次 step/finalize 失效,**需立即複製** (`strdup`/`std::string`)。

六、常見編譯錯誤速查

總結

32 位用預編譯 DLL + lib.exe 產生 .lib;64 位直接編譯 sqlite3.c。掌握 open → prepare_v2 → bind → step → finalize → close 六步曲與參數化查詢、WAL、交易批次三大效能/安全鐵律,即可在任何 C/C++ 專案中穩健驅動 SQLite。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
錯誤原因解決
LNK2019: unresolved external symbol sqlite3_open未連結 sqlite3.lib / 未加入 sqlite3.c依上述步驟補齊
mspdb110.dll 缺失 (執行 lib.exe 時)VS 版本不匹配從 Common7\IDE 複製對應版本 mspdb*.dll 到 lib.exe 目錄
64 位專案載入 32 位 DLL專案平台 x64 但引用 x86 DLL改用原始碼編譯或安裝 64 位 DLL