我有一个简单的hello world C++程序,它链接sqlite3.dll(64位版本)。应用程序无法正确启动(0xc000007b)Visual Studio C++
我在相应的路径中正确添加了sqlite3.h和sqlite3.dll。这些项目针对64位体系结构进行编译。编译和链接没问题。
当我尝试运行exe文件时出现问题。
我在这里看到很多问题,建议使用依赖walker。我在这里把截图:
我不明白为什么失败,因为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
与以下说明:
1)加载vcvars32.bat amd64
2 )然后我cd:
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(64二进制文件)转换与到sqlite3.lib以下命令:
lib /def:sqlite3.def /OUT:sqlite3.lib /MACHINE:x64
没有运气,同样的错误。
编辑3
我把该dll中错误的文件夹(VS有重名一个奇怪的输出目录树)。现在把官方 DLL放在正确的文件夹它的工作原理。
我设法修复我的自定义生成的DLL,请参阅接受的答案。我拿着官方的sqlite3.def文件,并通过添加/ def开关来修改编译命令。鉴于def是针对更新版本的sqlite的,linker抱怨缺少一些符号。我从sqlite3.def文件中删除了这些符号,并正确编译了dll文件,并生成了.lib和.exp文件。(因为lib文件是直接创建的,所以现在不需要lib命令)。把新的dll放在正确的文件夹的作品就像是魅力。
请不要将问题分类为重复。
感谢
不要害怕,只有重复被关闭为重复。 :-) – Downvoter
从我可以看到,似乎你的DLL编译没有任何出口,也许一些DEF文件在编译过程中丢失?您的sqlite3.dll没有任何导出表项。将/DEF:sqlite3.def添加到您的sqlite编译命令中 –
他们将DEF文件放在二进制包中:https://www.sqlite.org/2015/sqlite-dll-win64-x64-3090100.zip。下载DEF文件并将/ DEF参数添加到您的'cl'命令 –