SQLite 以單一 sqlite3.c + sqlite3.h 發布,嵌入專案極簡單,但 32/64 位 DLL/Import Library 生成常卡住新手。本文涵蓋 Windows 下 Visual Studio 專案整合、Linux/macOS 編譯、核心 API 流程與防注入最佳實務。
sqlite-dll-win32-x86-*.zip 解壓得 sqlite3.dll、sqlite3.def。lib.exe /MACHINE:X86 /DEF:sqlite3.def /OUT:sqlite3.lib
產生 sqlite3.lib (Import Library) 與 sqlite3.exp。sqlite3.lib;C/C++ → 一般 → 額外包含目錄 加入標頭檔目錄。#include "sqlite3.h"
#pragma comment(lib, "sqlite3.lib") // MSVC 自動連結
sqlite3.dll 放在 .exe 同目錄或 PATH 目錄。官方不提供 64 位預編譯 DLL,最穩定做法:
sqlite-amalgamation-*.zip(含 sqlite3.c、sqlite3.h、sqlite3ext.h)。sqlite3.c、sqlite3.h 加入專案(或建立靜態庫專案單獨編譯)。DSQLITE_THREADSAFE=1
DSQLITE_DEFAULT_MEMSTATUS=0
DSQLITE_MAX_MMAP_SIZE=0x7FFFFFFF
# 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
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** 防注入。sqlite3_exec(db, "PRAGMA journal_mode=WAL;", 0, 0, 0); 讀寫並行、抗崩潰。BEGIN;、後 COMMIT;,速度提升 100 倍+。SQLITE_OK (0) 表示成功,否則用 sqlite3_errmsg(db) 取得訊息。sqlite3_column_text 回傳指標屬於 SQLite 內部,下一次 step/finalize 失效,**需立即複製** (`strdup`/`std::string`)。| 錯誤 | 原因 | 解決 |
|---|---|---|
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 |