2013-04-23 130 views
0

我正在開發一個使用mingw47的Qt 5.0 dekstop應用程序。我在這個應用程序中使用QtMultimedia來錄製和播放音頻。我已經測試過它的調試和它的作品。當我嘗試構建它用於發佈並運行可執行文件時,我無法播放通常可在調試模式下播放的音頻文件。我運行可執行文件之前,已經添加下列DLL:在發佈模式下使用QtMultimedia部署Qt應用程序

D3D_Compiler_43.dll,
icudt49.dll,
icuin49.dll,
icuuc49.dll,
libEGL.dll,
libgcc_s_sjlj-1 .DLL,
libGLESv2.dll,
liblibmpeg2_plugin.dll,
的libstdC++ - 6.dll,
libwinpthread-1.DLL,
Qt5Core.dll,
Qt5Gui.dll,
Qt5Multimedia.dll,
Qt5Network.dll,
Qt5Widgets.dll,
Qt5Xml.dll,
插件/平臺/(所有DLL),
插件/ mediaservice /(所有DLL),
插件/播放列表格式(所有dll)

可能是錯誤的?或者我錯過了什麼其他的DLL?

+1

*行不通*是不是一個足夠的問題描述。請詳細說明。 – Oswald 2013-04-23 03:49:13

+0

對不起。我的意思是應用程序啓動,但我無法播放可以在調試模式下播放的音頻文件。 – aswin 2013-04-23 03:51:09

+0

你是什麼意思,你不能播放音頻文件? * play *按鈕丟失了嗎?你的鼠標指針是否奇蹟般地避免了* play *按鈕? – Oswald 2013-04-23 03:52:43

回答

0

我找到了答案。現在我的應用程序運行它可以在運行可執行文件時播放音頻文件。

儘管沒有的Depends.exe上市,我們使用QMediaPlayer時,應添加下列DLL:

Qt5MultimediaWidgets
Qt5OpenGL

這裏是參考:https://bugreports.qt-project.org/browse/QTBUG-30172

0

您的列表中的所有鏈接到應用程序的導入庫都將被操作系統自動加載。如果它們中的任何一個丟失了,你會得到一個對話框,告訴你哪個DLL加載失敗。只有那些看起來像他們可能被應用程序手動加載的插件是插件。確保你告訴QT多媒體系統加載它們。另外請確保你檢查由multiamedia管理器返回的錯誤代碼

鑑於您近期發表的評論,即音頻在調試模式下播放,但未在發佈模式下播放,這表明您已將插件DLL放在錯誤的位置。當您從資源管理器或命令行啓動應用程序時,plugins目錄需要與應用程序位於同一目錄中。您的目錄結構應如下所示:

c:\stackoverflow\myprogram.exe 
c:\stackoverflow\plugins\platforms\(all dlls) 
c:\stackoverflow\plugins\mediaservice\(all dlls) 
c:\stackoverflow\plugins\playlistformats\(all dlls) 
c:\stackoverflow\D3D_Compiler_43.dll 
c:\stackoverflow\icudt49.dll 

... other dll's here... 

c:\stackoverflow\Qt5Network.dll 
c:\stackoverflow\Qt5Widgets.dll 
c:\stackoverflow\Qt5Xml.dll 
+0

我把所有的插件放在_plugins_文件夾中。我使用'qApp-> addLibraryPath(「插件」)添加庫路徑;'' 所以我有一個文件夾_plugins_裏面有3個文件夾:mediaservice,platforms,playlistformats - 每個包含與qt安裝目錄中相同的dll。如何在發佈模式下檢查錯誤代碼? – aswin 2013-04-23 04:01:27

+0

如果你可以在你的問題中包含這樣的信息,那將會很好。會消除很多意見,並防止這變成一個擴展的討論。 – 2013-04-23 04:03:52

+0

對不起。現在如何在發佈模式下運行可執行文件時檢查錯誤代碼? – aswin 2013-04-23 04:13:26

1

更新:使用windeployqt.exe!它工作得很好。

http://doc.qt.io/qt-5/windows-deployment.html#the-windows-deployment-tool

使用windeployqt是 你的Qt安裝(例如)的bin目錄添加到PATH變量的最簡單方法,然後 運行:

windeployqt <path-to-app-binary> 

當您在發佈模式下運行應用程序時(當它運行時,從Qt Creator中運行),e xecute depends.exe並將其指向應用程序。

記下從Qt文件夾引用的所有dll。

如果你想花更多的時間與它

另一種方法:試圖刪除文件,因爲Windows不會讓你刪除的文件夾或DLL,而它在使用

你可以手工看着辦吧。所以你可以去備份你的Qt安裝,然後運行你的應用程序,確保它已經連接到了它將要使用的所有dll,然後嘗試刪除你的Qt安裝中的文件夾和文件。 Windows不會讓你刪除正在使用的文件。

另外這裏,如果你想知道Windows如何解決DLL的:

http://msdn.microsoft.com/en-us/library/7d83bc18(v=vs.80).aspx

編輯:另外,你並不需要使該文件夾稱爲插件在你的EXE目錄。它應該是這樣的:

Qt 4.x的:

./myexe.exe 
./QtCore.dll 
./imageformats/qjpegd4.dll // Note: there isn't a "plugins" folder here 

Qt的5.x的:(採取從here

The executable     ./plugandpaint.exe 
The Basic Tools plugin   ./plugins/pnp_basictools.dll 
The ExtraFilters plugin   ./plugins/pnp_extrafilters.dll 
The Qt Windows platform plugin ./platforms/qwindows.dll 
The Qt Core module    ./Qt5Core.dll 
The Qt GUI module    ./Qt5Gui.dll 
The Qt Widgets module   ./Qt5Widgets.dll 

而且運行qDebug() << QApplication::libraryPaths(),並作出paths注意,在您的計算機上搜索dll。

希望有所幫助。

+0

我試過你的建議刪除一些文件,發現應用程序使用mediaservice文件夾中的dsengine.dll。我在主函數中添加了以下代碼:'a.addLibraryPath(「C:/ somepath/release/mediaservice」);'並再次構建它。在發佈模式下運行構建時,我可以播放音頻,並且無法刪除dsengine.dll。但是,手動運行可執行文件時,我無法播放音頻,並且可以刪除dsengine.dll。當我添加庫路徑時可能有什麼錯誤? – aswin 2013-04-23 10:53:35

+0

對不起,我爲Qt 4.8部署提出了一些指導。以下是Qt 5.x的說明:http://qt-project.org/doc/qt-5.0/qtdoc/deployment-windows.html這與Oblivious船長的答案非常相似。另外,去找出你現在有什麼庫路徑。 http://qt-project.org/doc/qt-5.0/qtcore/qcoreapplication.html#libraryPaths添加到您的主文件:'qDebug()<< QApplication :: libraryPaths();'看看打印出來。 – phyatt 2013-04-23 14:53:01

+0

我將下面的代碼添加到主文件並使用QMessageBox對其進行測試: 'QStringList libPath;' 'libPath.append(「C:\\ somepath \\ release \\ mediaservice」);' 'libPath.append 「C:\\ somepath \\ release」);' 'a.setLibraryPaths(libPath);' 在發佈模式下運行並手動運行可執行文件時,都會運行上述設置的路徑。所以應該沒有區別。但由於未知的原因,在運行可執行文件時不會使用mediaservice文件夾中的dll,因爲它們可以被刪除。 – aswin 2013-04-24 02:36:19

相關問題