【问题标题】:The application was unable to start correctly (0xc000007b) Visual Studio C++应用程序无法正确启动 (0xc000007b) Visual Studio C++
【发布时间】:2016-01-25 15:37:45
【问题描述】:

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

我已在各自的路径中正确添加了 sqlite3.h 和 sqlite3.dll。这些项目针对 64 位架构进行编译。编译和链接很顺利。

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

我在这里看到很多建议使用依赖遍历器的问题。我把截图放在这里:

我不明白为什么它会失败,因为 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 in:

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 有一个奇怪的输出目录树,名称重复)。现在将 official dll 放在正确的文件夹中它可以工作

我还设法修复了我的自定义构建的 dll,请参阅接受的答案。我拿了官方的 sqlite3.def 文件并通过添加 /def 开关修改了编译命令。鉴于 def 是针对较新版本的 sqlite 的事实,链接器抱怨缺少一些符号。我从 sqlite3.def 文件中删除了这些符号,它正确编译了 dll 文件并生成了 .lib 和 .exp 文件。 (现在不需要 lib 命令,因为 lib 文件是直接创建的)。将新的 dll 放在正确的文件夹中就像一个魅力

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

谢谢

【问题讨论】:

  • 不要害怕,只有重复项作为重复项关闭。 :-)
  • 据我所知,您的 DLL 编译时似乎没有任何导出,可能是编译过程中丢失了某些 DEF 文件?您的 sqlite3.dll 没有任何导出表条目。将 /DEF:sqlite3.def 添加到您的 sqlite 编译命令中
  • 他们将 DEF 文件放入二进制包中:sqlite.org/2015/sqlite-dll-win64-x64-3090100.zip。下载 DEF 文件并将 /DEF 参数添加到您的cl 命令
  • 谢谢,但请参阅 EDIT 2
  • @72DFBF5BA0DF5BE9。有两个问题。 1)我将 dll 放在错误的文件夹中(VS 有一个奇怪的输出目录树,名称重复)。这就是为什么官方 dll 无法正常工作的原因。 2) 自定义构建 dll 缺少导出表。我通过添加 /def 和官方 sqlite 页面的 def 文件来修改编译命令。鉴于我正在编译旧版本,因此缺少一些导出,因此我将它们从 def 文件中删除。一切正常!请添加答案,我会接受!

标签: c++ visual-studio-2010 dll linker


【解决方案1】:

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

那你需要把这个添加到cl编译命令:/DEF:sqlite3.def

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

【讨论】:

    【解决方案2】:

    检查您的路径中是否有另一个 sqlite3.dll。当我尝试它时,我得到了同样的错误。事实证明,在我的 python 目录的 %PATH% 中有一个(32 位?)sqlite3.dll。将 64 位 dll 复制到与可执行文件相同的目录并再次运行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-07-21
      • 2019-08-29
      • 2016-11-13
      • 2017-08-21
      相关资源
      最近更新 更多