2016-01-29 41 views
0

我試圖運行我的Qt應用程序時似乎遇到運行時錯誤。在發佈文件夾中運行的Qt可執行文件 - Program Files(x86)中的運行時錯誤

我能夠在發佈模式下成功構建我的應用程序,它運行得很好,坐在版本文件夾中。但是,這並不是用戶安裝它時所處的位置。我需要它運行在C:/Program Files (x86)/ApplicationName/application.exe

所以我把應用程序移到了那裏。我最近爲應用程序添加了一些SQLite功能。所以我期望得到某種丟失的DLL文件錯誤。我做到了。所以我找到了正確的dll文件(Qt5Sql.dll)並將其移動到該目錄中。現在我得到一個運行時錯誤。

要找出導致此運行時錯誤的原因,我引入了一堆QMessageBox::warning s來查看它何時出現錯誤。錯誤正在引起這行代碼:

sqlite = new SQLite(QString("%1%2").arg(myDocuments).arg(SQLite::DATABASE_NAME)); 

我檢查,以確保我正在從QString("%1%2").arg(myDocuments).arg(SQLite::DATABASE_NAME)預期QString和我。

這裏是它們的構造看起來像sqlite.cpp

SQLite::SQLite(const QString& path) 
{ 
    database = QSqlDatabase::addDatabase("QSQLITE"); 
    database.setDatabaseName(path); 

    if (!database.open()) 
    { 
     QMessageBox::warning(NULL, "Error", "Failed to open database."); 
    } 
} 

的奇怪的事情是,我知道我還沒有進入這個構造,因爲我在構造函數和我的第一行之前把QMessageBox::warning在運行時錯誤之前沒有看到。不過,我在構造函數之前直接看到QMessageBox::warning

任何人都知道可能會導致這種情況?

編輯:

我相信我是缺少sqldriver文件夾,其中包括qsqlite.dll。我將該文件夾添加到我的exe文件所在的位置,但仍然出現運行時錯誤。我增加了以下我的代碼調試目的:

QStringList drivers = QSqlDatabase::drivers(); 
QString ds; 
int len = drivers.length(); 
for (int x = 0; x < len; x++) 
{ 
    ds.append(QString("%1\n").arg(drivers[x])); 
} 
QMessageBox::warning(this, "DRIVERS", ds); 
sqlite = new SQLite(QString("%1%2").arg(myDocuments).arg(SQLite::DATABASE_NAME)); 

QMessageBox顯示:

QSQLITE 
QODBC 
QODBC3 
QPSQL 
QPSQL7 

後,我在對話框上單擊OK,但我仍然得到的運行時錯誤。儘管QSQLITE司機顯然是可用的,我得到的這行代碼的運行時錯誤:

QSqlDatabase database = QSqlDatabase::addDatabase("QSQLITE"); 
+0

'Qt5Sql.dll'是通用的sql庫。您仍然需要路徑中的sqlite插件庫。這在運行時解決。不確定路徑,它在哪裏搜索。 – UldisK

+0

我在想我可能會特別需要類似於sqlite的東西。但是,這到底是什麼?我沒有看到任何'Qt5Sqlite.dll'或類似的東西。 –

+0

您需要在'application.exe'附近放置' \ plugins'的'sqldrivers'文件夾。這是所有插件的通常規則。 –

回答

0

多頭髮拉我想通了這個問題之後。看來我使用的Qt5* dll中有一個已經過時了。我看到這個錯誤,當我提出從C:/Program Files...的DLL文件來釋放我的文件夾,並試圖從QtCreator運行的發行版本:

Cannot mix incompatible Qt library (version 0x50100) with this library (version 0x50101) 

見狀後,我所有的Qt5* dll文件更新我C:/Program Files (x86)/ApplicationName/目錄和固定問題。

1

爲了簡化您的生活,如果您有最新版本的Qt 5,則可以在您的應用程序上使用windeployqt以獲取正確位置處的依賴關係。

相關問題