1. 环境准备搭建Windows编译环境在Windows上编译SqlCipher需要先准备好必要的工具链和依赖库。我推荐使用Visual Studio 2019或2022作为主要开发环境实测这两个版本对SqlCipher的兼容性最好。下面是具体需要安装的组件Visual Studio安装时需要勾选使用C的桌面开发工作负载特别要确保包含MSVC编译器工具集Windows 10/11 SDKC CMake工具OpenSSL开发包这是SqlCipher加密功能的核心依赖。建议从 官方推荐站点 下载完整版Full安装包。以64位系统为例开发版本选择Win64 OpenSSL v1.1.1或v3.x安装时勾选将OpenSSL DLL复制到系统目录记录安装路径如C:\OpenSSL-Win64后续编译会用到ActiveTclSqlCipher的编译系统依赖Tcl脚本环境。推荐安装ActiveTcl 8.6社区版官网下载地址https://www.activestate.com/products/tcl/安装后验证在CMD运行tclsh应能进入交互式环境提示如果遇到环境变量问题可以手动添加OpenSSL的bin目录如C:\OpenSSL-Win64\bin到系统PATH变量。我曾经因为漏掉这一步导致链接阶段报错排查了半天才发现问题。2. 获取SqlCipher源码官方源码仓库位于GitHub建议使用git克隆最新稳定版本git clone https://github.com/sqlcipher/sqlcipher.git cd sqlcipher git checkout v4.5.3 # 以具体版本为准如果网络环境不支持git也可以直接下载源码zip包。解压后需要注意路径不要包含中文或空格建议放在较短的路径下如C:\dev\sqlcipher避免后续命令行操作时路径过长源码目录中关键文件说明Makefile.mscWindows平台专用编译脚本sqlite3.c合并后的单一源文件需要先通过nmake生成shell.c命令行工具实现3. 编译方法一直接使用CL命令行这是最基础的编译方式适合快速验证或简单集成场景。操作步骤如下打开VS开发人员命令提示符x64 Native Tools导航到SqlCipher源码目录首先生成合并的sqlite3.c文件nmake /f Makefile.msc sqlite3.c使用cl编译器生成动态链接库cl -IC:\OpenSSL-Win64\include sqlite3.c ^ -DSQLITE_API__declspec(dllexport) ^ -DSQLITE_TEMP_STORE2 ^ -DSQLITE_HAS_CODEC ^ /MT ^ -link -dll -out:sqlcipher.dll ^ -LIBPATH:C:\OpenSSL-Win64\lib libcrypto.lib libssl.lib参数说明-I指定OpenSSL头文件路径/MT表示使用静态运行时库-DSQLITE_HAS_CODEC启用加密功能-LIBPATH指定库文件搜索路径编译成功后会产生sqlcipher.dll动态链接库sqlcipher.lib导入库sqlite3.h需要手动复制到输出目录4. 编译方法二修改Makefile.msc自动化编译对于需要频繁编译的场景修改Makefile.msc会更高效。以下是具体调整步骤用文本编辑器打开Makefile.msc找到TEMP_STORE定义修改为TCC $(TCC) -DSQLITE_TEMP_STORE2 RCC $(RCC) -DSQLITE_TEMP_STORE2添加加密相关宏定义TCC $(TCC) -DSQLITE_HAS_CODEC RCC $(RCC) -DSQLITE_HAS_CODEC配置OpenSSL路径根据实际安装位置修改TCC $(TCC) -IC:\OpenSSL-Win64\include RCC $(RCC) -IC:\OpenSSL-Win64\include添加链接参数LTLIBPATHS $(LTLIBPATHS) /LIBPATH:C:\OpenSSL-Win64\lib LTLIBS $(LTLIBS) libcrypto.lib libssl.lib保存后执行完整编译nmake /f Makefile.msc clean nmake /f Makefile.msc这种方法会生成更多文件包括sqlite3.exe命令行工具sqlite3.dll动态库sqlite3.lib导入库libsqlite3.lib静态库5. 编译产物验证与测试编译完成后强烈建议进行基本功能测试验证加密功能是否生效sqlite3.exe test.db PRAGMA keytestpassword; CREATE TABLE secret(data TEXT); INSERT INTO secret VALUES(encrypted data); .quit尝试用未加密方式打开数据库应失败sqlite3.exe test.db SELECT * FROM secret; # 应该报错使用DB Browser for SQLite等工具验证普通SQLite工具无法打开加密数据库需要支持SqlCipher的专用版本才能访问常见问题排查如果提示不是有效的数据库文件通常是加密未生效链接错误LNK2001可能是OpenSSL库路径配置错误运行时缺少DLL需要将OpenSSL的bin目录加入PATH6. 实际项目集成指南将编译好的SqlCipher集成到C/C项目中需要注意以下要点头文件配置#define SQLITE_HAS_CODEC 1 #include sqlite3.h #pragma comment(lib, sqlcipher.lib)初始化加密数据库sqlite3 *db; int rc sqlite3_open(encrypted.db, db); if(rc SQLITE_OK) { rc sqlite3_key(db, secretkey, 9); if(rc ! SQLITE_OK) { // 处理错误 } }版本匹配原则开发环境与编译SqlCipher使用的Visual Studio版本一致32/64位架构必须匹配动态链接时OpenSSL DLL版本需要兼容静态链接注意事项需要同时链接sqlcipher.lib和OpenSSL的静态库编译选项必须完全一致如/MT或/MD7. 高级功能与疑难解答数据库密码修改// 先打开数据库并设置原密码 sqlite3_rekey(db, newpassword, 10);加密算法选择需重新编译TCC $(TCC) -DSQLITE_CIPHERAES_256_CBC常见编译错误解决方案找不到tclsh确认ActiveTcl已安装且PATH中包含其bin目录或手动指定TCL路径set TCLDIRC:\ActiveTclopenssl符号未定义检查libcrypto.lib和libssl.lib是否存在确认-LIBPATH指向正确的OpenSSL lib目录架构不匹配确保使用匹配的VS命令提示符x86/x64OpenSSL版本与目标架构一致性能优化建议启用内存模式PRAGMA temp_storeMEMORY调整页面大小PRAGMA cipher_page_size4096对于读写频繁的场景考虑使用WAL模式