我有一个简单的 hello world C++ 程序,它链接 sqlite3.dll (64 位版本)。
我已在各自的路径中正确添加了 sqlite3.h 和 sqlite3.dll 。这些项目针对 64 位架构进行编译。编译和链接都很顺利。
当我尝试运行 exe 时出现问题。
我在这里看到了很多建议使用依赖步行器的问题。我把截图放在这里:
我不明白为什么它会失败,因为 sqlite3.dll 位于 exe 文件夹中。如果我理解得很好,依赖步行器就会找到它。拱柱全部为 x64。
源代码:
#include <iostream>
#include "sqlite3.h"
int main()
{
std::cout<< "Hello world and all that" << std::endl;
sqlite3 *db;
char *zErrMsg = 0;
int rc;
rc = sqlite3_open("test.db", &db);
if( rc ){
fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
exit(0);
}else{
fprintf(stderr, "Opened database successfully\n");
}
sqlite3_close(db);
return 0;
}
如果 exe 和 dll 都是 64 位,我还使用了以下实用程序:PE Deconstructor
。它们都是 64 位的。
EDIT
我按照以下说明自行编译了 sqlite3.dll
https://www.sqlite.org/howtocompile.html https://www.sqlite.org/howtocompile.html
并遵循以下说明:
1) 已加载vcvars32.bat amd64
2)然后我进入:
C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\amd64
3)并启动命令:
cl sqlite3.c -link -dll -out:sqlite3.dll /MACHINE:x64
EDIT 2
我尝试使用以下命令将官方 sqlite3.dll + sqlite3.def(x64 二进制文件)转换为 sqlite3.lib:
lib /def:sqlite3.def /OUT:sqlite3.lib /MACHINE:x64
运气不好,同样的错误。
EDIT 3
我将 dll 放在了错误的文件夹中(VS 有一个奇怪的输出目录树,名称重复)。现在把officialdll 位于正确的文件夹中it works.
我还设法修复了我的自定义构建的 dll,请参阅已接受的答案。我采用了官方的 sqlite3.def 文件并通过添加 /def 开关修改了编译命令。鉴于 def 适用于较新版本的 sqlite,链接器抱怨缺少一些符号。我从 sqlite3.def 文件中删除了这些符号,它正确编译了 dll 文件,并生成了 .lib 和 .exp 文件。 (现在不需要 lib 命令,因为 lib 文件是直接创建的)。将新的 dll 放入正确的文件夹中奇迹般有效.
请不要将问题归类为重复。
Thanks