编译含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
相关产品推荐
相关产品推荐

