编译 sqlite 合并以获取用户身份验证会引发错误 C2129 和 C1083

Posted

技术标签:

【中文标题】编译 sqlite 合并以获取用户身份验证会引发错误 C2129 和 C1083【英文标题】:Compiling sqlite amalgamation to get user authentication throws errors C2129 and C1083 【发布时间】:2019-07-11 13:45:28 【问题描述】:

我想编译 sqlite 合并以创建一个通过用户身份验证受密码保护的数据库。

我遵循了这个教程:https://www.sqlite.org/howtocompile.html 还有 SQLite 的 user_authentication 文档:https://www.sqlite.org/src/doc/trunk/ext/userauth/user-auth.txt

当我尝试在没有额外编译时选项“-DSQLITE_USER_AUTHENTICATION”的情况下编译它并且不添加其他文档时它可以工作。当我尝试编译它时,我在 sqlite.c 处得到错误 C2129,在 userauth.c 处得到错误 C1083

在这个目录中有以下文件:

shell.c sqlite3.c sqlite3.h sqlite3ext.h sqlite3userauth.h userauth.c
cl -DSQLITE_USER_AUTHENTICATION shell.c sqlite3.c userauth.c -Fesqlite3.exe

以下输出:

shell.c
sqlite3.c
sqlite3.c(222878): error C2129: static function 'void sqlite3CryptFunc(sqlite3_context *,int,sqlite3_value **)' declared but not defined
sqlite3.c(16263): note: see declaration of 'sqlite3CryptFunc'
userauth.c
userauth.c(26): fatal error C1083: Cannot open include file: 'sqliteInt.h': No such file or directory
Generating Code...

如果 C# 的 db.SetPassword("MyPW") 在 c 中可用,那将是完美的!

【问题讨论】:

【参考方案1】:

我遵循 [...] SQLite 的用户身份验证文档:https://www.sqlite.org/src/doc/trunk/ext/userauth/user-auth.txt

嗯,不,看起来不像你做的那样。那些文档说

通过包含 ext/userauth/userauth.c 源代码文件在构建并添加 -DSQLITE_USER_AUTHENTICATION 编译时选项。 ext/userauth/sqlite3userauth.h 头文件可用于 应用程序来定义接口。

当使用 SQLite 合并时,追加 ext/userauth/userauth.c 源文件放到合并的末尾。

您正在使用合并,因此您应该 [内容] userauth.c 添加到合并中。即,将其内容复制到sqlite3.c 的末尾。从您的目录列表和命令行中,您似乎正在尝试将其构建为一个单独的源文件,以便在最后链接到主文件。这并不等同,特别是它对static 函数和变量范围的影响有所不同,这正是您的编译器所抱怨的。

尚不清楚-DSQLITE_USER_AUTHENTICATION 是否也应与合并一起使用。 SQLite 文档的字面意思不是这样,但我倾向于猜测,如果您想启用该功能,无论哪种方式实际上都需要它。

关于缺少标题的错误有点令人担忧,您可能会再次看到它。如果这样做,只需删除或注释掉相应的 #include 指令就足够了,因为该标头中所有需要的声明(主要来源之一)应该已经包含在合并中。

【讨论】:

查看at the repository source of userauth.c,整个文件的条件依赖于设置的SQLITE_USER_AUTHENTICATION,因此可能应该被定义。但是,sqliteInt.h 的内容已经存在于合并中,因此 OP 应该能够删除 #include 行(在将 userauth.c 附加到合并之后)。不过,我还没有测试过! 谢谢,通过附加代码解决了这两个问题! 这是一个完全独立的问题,@Duco,如果你把它当作一个问题,你更有可能得到有用的答案。 @JohnBollinger 感谢您的详细回答。我收到另一个错误here。你能看一下吗?

以上是关于编译 sqlite 合并以获取用户身份验证会引发错误 C2129 和 C1083的主要内容,如果未能解决你的问题,请参考以下文章

.Net Core 3.1 合并 JWT 和 OpenIDConnect 身份验证

无效的凭据引发身份验证突变异常

在 Restful Web 服务中如何以编程方式获取用户名或密码(基本身份验证)

来自外部源的 Django 用户和身份验证

Microsoft Graph API - Blazor Server App .NET 5.0 使用 Azure 身份验证,MsalUiRequiredException 因用户质询而引发

Unity for Android 中的 Azure AD 身份验证出错