You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

编译含sqlite3_key的SQLCipher代码报错:‘sqlite3_key’未声明

解决sqlite3_key未声明的编译错误

问题核心

sqlcipher的加密相关函数(如sqlite3_key)默认不会在头文件中暴露声明,必须通过特定宏启用,同时你的编译命令存在拼写错误。

解决方案

1. 修正代码,启用加密函数声明

在包含sqlite3.h前定义SQLITE_HAS_CODEC宏,让头文件暴露加密相关函数的声明;同时移除无用的sqlite.h.in引用:

#define SQLITE_HAS_CODEC
#include <sqlite3.h>
#include <cstring> 

int main() {
    sqlite3 *db = nullptr;
    const char *dbName = "en.db";
    const char *key = "encryption_key";

    int result = sqlite3_open(dbName, &db);
    
    result = sqlite3_key(db, key, strlen(key));
    
    sqlite3_close(db);
    return 0;
}

2. 修正编译命令的拼写错误

你当前命令中的-lsqlciphe少了一个字母r,正确的编译命令应为:

g++ encrypt.cpp -o encrypt -Isqlcipher/include -Lsqlcipher/libs -ldl -lsqlcipher

3. 替代方案:编译时通过参数定义宏

如果不想修改代码,也可以在编译命令中直接通过-D参数定义宏:

g++ encrypt.cpp -o encrypt -DSQLITE_HAS_CODEC -Isqlcipher/include -Lsqlcipher/libs -ldl -lsqlcipher

原理说明

sqlcipher的sqlite3.h中,sqlite3_key等加密函数的声明被包裹在#ifdef SQLITE_HAS_CODEC条件编译块内,只有定义该宏,编译器才能识别这些函数的声明,解决“未在作用域中声明”的错误。

内容的提问来源于stack exchange,提问作者FelX3

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 09:12:50