2015-10-26 209 views
1

我有一个简单的hello world C++程序,它链接sqlite3.dll(64位版本)。应用程序无法正确启动(0xc000007b)Visual Studio C++

我在相应的路径中正确添加了sqlite3.h和sqlite3.dll。这些项目针对64位体系结构进行编译。编译和链接没问题。

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

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

enter image description here

我不明白为什么失败,因为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放在正确的文件夹的作品就像是魅力

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

感谢

+2

不要害怕,只有重复被关闭为重复。 :-) – Downvoter

+0

从我可以看到,似乎你的DLL编译没有任何出口,也许一些DEF文件在编译过程中丢失?您的sqlite3.dll没有任何导出表项。将/DEF:sqlite3.def添加到您的sqlite编译命令中 –

+0

他们将DEF文件放在二进制包中:https://www.sqlite.org/2015/sqlite-dll-win64-x64-3090100.zip。下载DEF文件并将/ DEF参数添加到您的'cl'命令 –

回答

0

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

相关问题