返回> 网站首页
sqlcipher编译
yoours2026-05-25 19:47:17
简介一边听听音乐,一边写写文章。
一、Perl
https://strawberryperl.com/releases.html
二、openssl
perl Configure VC-WIN32 --prefix=“你的安装位置” // 编译32位
perl Configure VC-WIN64A --prefix=“你的安装位置” // 编译64位
nmake
nmake install
三、sqlcipher
1. 生成sqlite3.c
nmake /f Makefile.msc sqlite3.c
2. 动态库
cl -I"F:\\compile\\install\\include" sqlite3.c -DSQLITE_API=__declspec(dllexport) -DSQLCIPHER_CRYPTO_OPENSSL -DSQLITE_TEMP_STORE=2 -DSQLITE_THREADSAFE=1 -DSQLITE_HAS_CODEC -DSQLITE_EXTRA_INIT=sqlcipher_extra_init -DSQLITE_EXTRA_SHUTDOWN=sqlcipher_extra_shutdown -DHAVE_STDINT_H /MT -link -dll -out:sqlcipher.dll -LIBPATH:"F:\compile\install\lib" libcrypto.lib
3. 静态库
(1)cl -I"E:\\openssl\\include" sqlite3.c -DSQLCIPHER_CRYPTO_OPENSSL -DSQLITE_TEMP_STORE=2 -DSQLITE_THREADSAFE=1 -DSQLITE_HAS_CODEC -DSQLITE_EXTRA_INIT=sqlcipher_extra_init -DSQLITE_EXTRA_SHUTDOWN=sqlcipher_extra_shutdown -DHAVE_STDINT_H /MT
(2)lib /out:libsqlcipher.lib sqlite3.obj
四、示例
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "sqlite3.h" // SQLCipher扩展的头文件
#define DATABASE_NAME "encrypted.db"
#define DATABASE_KEY "your_secret_key"
// 数据库操作错误处理宏
#define CHECK_SQLITE(rc, db, msg) \
if (rc != SQLITE_OK) { \
fprintf(stderr, "[ERROR] %s: %s\n", msg, sqlite3_errmsg(db)); \
sqlite3_close(db); \
exit(1); \
}
int callback_select(void* data, int argc, char** argv, char** col_name) {
// 处理SELECT查询结果...
return 0;
}
int main()
{
sqlite3* db = NULL;
char* errMsg = NULL;
// 1. 打开数据库(若文件不存在则创建)
int rc = sqlite3_open(DATABASE_NAME, &db);
CHECK_SQLITE(rc, db, "Can't open database");
// 2. 对数据库进行加密[reference:9]
rc = sqlite3_key(db, DATABASE_KEY, strlen(DATABASE_KEY));
CHECK_SQLITE(rc, db, "Can't set encryption key");
// 3. 执行SQL操作(建表、插入、查询)
const char* sqlCreate = "CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY, name TEXT, age INTEGER);";
rc = sqlite3_exec(db, sqlCreate, 0, 0, &errMsg);
CHECK_SQLITE(rc, db, "Can't create table");
const char* sqlInsert = "INSERT INTO users (name, age) VALUES ('张三', 28);";
rc = sqlite3_exec(db, sqlInsert, 0, 0, &errMsg);
CHECK_SQLITE(rc, db, "Can't insert data");
const char* sqlSelect = "SELECT * FROM users;";
rc = sqlite3_exec(db, sqlSelect, callback_select, NULL, &errMsg);
CHECK_SQLITE(rc, db, "Can't select data");
// 4. 修改数据库密码(必须先提供旧密码)[reference:10]
rc = sqlite3_rekey(db, "new_secret_key", strlen("new_secret_key"));
CHECK_SQLITE(rc, db, "Can't rekey database");
// 5. 关闭数据库连接
sqlite3_close(db);
return 0;
}