gpt4 book ai didi

c++ - 应用程序无法正确启动 (0xc000007b) Visual Studio C++

转载 作者:行者123 更新时间:2023-11-30 05:37:10 25 4
gpt4 key购买 nike

我有一个简单的 hello world c++ 程序,它链接 sqlite3.dll(64 位版本)。

我已经在各自的路径中正确添加了 sqlite3.h 和 sqlite3.dll。这些项目编译为 64 位架构。编译和链接正常。

当我尝试运行 exe 时出现问题。

我在这里看到很多问题建议使用 dependency walker。我把截图放在这里:

enter image description here

我不明白为什么它会失败,因为 sqlite3.dll 在 exe 的文件夹中。如果我理解得很好,依赖步行者会找到它。所有的 arch 列都是 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 位的。

编辑

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(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 放入正确的文件夹非常有效

请不要将问题分类为重复。

谢谢

最佳答案

因此,正如评论中所解释的,您需要从二进制包中下载 DEF 文件: https://www.sqlite.org/2015/sqlite-dll-win64-x64-3090100.zip

然后你需要将这个添加到cl编译命令:/DEF:sqlite3.def

现在您的 DLL 将在导出表中具有所需的条目。

关于c++ - 应用程序无法正确启动 (0xc000007b) Visual Studio C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33347423/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com