我有一个简单的hello world c ++程序,它链接了sqlite3.dll(64位版本)。
我已在相应的路径中正确添加了sqlite3.h和sqlite3.dll。这些项目编译为64位架构。编译和链接很好。
当我尝试运行exe时出现问题。
我在这里看到许多建议使用依赖性walker的问题。我将截图放在这里:
我不明白为什么它失败,因为sqlite3.dll在exe的文件夹中。如果我理解依赖沃克发现它。 arch列是x64 for all。
源代码:
#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位。
修改
我已按照
中的说明自行编译了sqlite3.dllhttps://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
编辑2
我尝试使用以下命令将官方sqlite3.dll + sqlite3.def(x64二进制文件)转换为sqlite3.lib:
lib /def:sqlite3.def /OUT:sqlite3.lib /MACHINE:x64
没有运气,同样的错误。
编辑3
我把dll放在错误的文件夹中(VS有一个带有重复名称的奇怪的输出目录树)。现在将官方 dll放在正确的文件夹中可以正常工作。
我设法修复了我的自定义内置dll,看到接受的答案。我拿了正式的sqlite3.def文件并通过添加/ def开关修改了编译命令。鉴于def是针对更新版本的sqlite的事实,链接器抱怨一些丢失的符号。我从sqlite3.def文件中删除了这些符号,它正确编译了dll文件,并生成了.lib和.exp文件。 (现在不需要lib命令,因为直接创建了lib文件)。将新dll放在正确的文件夹就像魅力一样。
请不要将问题归类为重复。
由于
答案 0 :(得分:2)
因此,如评论中所述,您需要从二进制包下载DEF文件: https://www.sqlite.org/2015/sqlite-dll-win64-x64-3090100.zip
然后您需要将其添加到cl
编译命令:/DEF:sqlite3.def
现在你的DLL将在导出表中包含必需的条目。
答案 1 :(得分:0)
检查路径中是否还有其他sqlite3.dll。当我尝试它时,我得到了同样的错误。事实证明在%PATH%的python目录中有一个(32位?)sqlite3.dll。将64位dll复制到与可执行文件相同的目录中,然后再次运行它。