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

时间:2015-10-26 13:50:25

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

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

我已在相应的路径中正确添加了sqlite3.h和sqlite3.dll。这些项目编译为64位架构。编译和链接很好。

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

我在这里看到许多建议使用依赖性walker的问题。我将截图放在这里:

enter image description here

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

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 

编辑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放在正确的文件夹就像魅力一样

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

由于

2 个答案:

答案 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复制到与可执行文件相同的目录中,然后再次运行它。