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

2024-02-20

我有一个简单的 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


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

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

现在您的 DLL 将在导出表中包含所需的条目。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

应用程序无法正确启动(0xc000007b)Visual Studio C++ 的相关文章