2015-10-26 139 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複製到與您的可執行文件相同的目錄並再次運行它。

相關問題