2017-07-13 39 views
0

在互聯網上有大量關於驅動程序加載失敗的查詢,但我的情況看起來很獨特。請幫忙。QSqlDatabase:驅動程序未加載,從另一個dll

我創建了一個我的代碼的DLL,它使用QSqlDatabase。所以依賴是像mylib.dll-> qt5sql.dll-> qsqlpsql.dll 當我使用mylib.dll運行測試應用程序時,它無法加載驅動程序。它列出了下來可用的驅動程序如下圖所示: QSqlDatabase:可用的驅動程序:QSQLITE QMYSQL QMYSQL3 QODBC QODBC3 QPSQL QPSQL7

然而,當我嘗試使用我的代碼作爲靜態庫,它工作絕對沒問題。所以對libpq.dll的依賴,PATH等的值都可以。有沒有其他人面臨這樣的問題?

+0

您是否擁有與文本應用程序可執行文件相同的文件夾中的所有三個dll? – Dmitry

+0

我在這方面嘗試了多種組合。 1.將exe和所有dll(包括qt5core和qt5sql)複製到同一個文件夾中。 2. exe和plugins/sqldrivers/driverdlls 3.exe和sqldrivers/driverdlls 4.默認安裝qt。我也使用QCoreApplication :: addLibraryPath(「./ plugins」);但它只能在我的代碼的dll外運行。它沒有任何效果。甚至嘗試setLibraryPath()的事情。 –

+0

下面是另一個可以嘗試的方法:1.將驅動程序放入可執行文件附近的'sqldrivers'文件夾中2.通過'QCoreApplication :: addLibraryPath'將'sqldrivers'文件夾添加到庫路徑中。 3.嘗試在代碼中使用它之前手動加載驅動程序:'QPluginLoader加載器(「sqldrivers/qsqlpsql.dll」); loader.load();' – Dmitry

回答

0

我發現它不是QT的問題,但由於在我的源代碼中使用了靜態變量,所以在我的DLL中出現問題。正如我們所知,如果不是DLL代碼的一部分,則會在運行時創建兩個不同的靜態變量實例(每個代表exe和DLL)。我有一個包含這些靜態變量的靜態庫。這個靜態庫被鏈接來創建一個DLL。所以基本上,驅動程序的名稱沒有傳遞給DLL,從而導致「Driver not loaded」錯誤。我通過消除靜態庫創建來解決問題。現在將源代碼構建在一起來創建DLL。

+0

如何「消除靜態庫創建」? –

+0

你的問題很短,也不清楚。檢查編譯器標誌以避免創建靜態庫。 CMake和其他工具提供了他們自己的方式。足夠的信息可用。 –

相關問題