スタックオーバーフローに関連すると思われるすべての質問に目を通しましたが、解決策はありません。
私はこのセットアップでQtアプリケーションを構築しています:
configure -developer-build -debug-and-release -opensource -nomake examples -nomake tests -platform win32-msvc2012 -no-opengl
で構築されたQt 5.2.0QMAKE_CXX += /D_USING_V110_SDK71_
を使用します開発マシン(上記)でプログラムをビルドして実行できます。開発マシンのProgram Filesディレクトリからパッケージをインストールして実行することもできます。
Windows Vistaマシン(複数のマシン)にインストールして実行する場合
(Windows 7のクリーンインストールでも失敗します)
私は得る:
Application failed to start because it could not find or load the QT platform plugin "windows"
そのため、指示に従って.platforms /ディレクトリを追加し、qwindows.dllを追加しました(qminimal.dllとqoffscreen.dllも追加しました)。また、libEGL.dll、libGLESv2.dllを追加しました(それらは必要ないはずだとは思いませんが)
Qoffscreen.dllを追加したら、次のメッセージが表示されます:Available platform plugins are: offscreen
Dependency Walkerを実行すると、次のエラーが表示されます。
GetProcAddress(0x76CA0000 [KERNEL32.DLL], "GetCurrentPackageId") called from "MSVCR110.DLL" at address 0x6AC6FDFA and returned NULL. Error: The specified procedure could not be found (127).
そしてさらに下に取得:
GetProcAddress(0x745A0000 [UXTHEME.DLL], "BufferedPaintUnInit") called from "COMCTL32.DLL" at address 0x745FFBF8 and returned 0x745AE18C.
This application failed to start because it could not find or load the Qt platform plugin "windows".
Available platform plugins are: offscreen.
Reinstalling the application may fix this problem.
このdllの問題を修正する方法はありますか?
私は自分の問題を解決しましたが、違いが何であるかはわかりません:
すべてのdllをqtディレクトリからアプリケーションディレクトリの./および./platformsの両方にコピーしました。
アプリケーションはエラーを通過しましたが、その後クラッシュしました。
VERSION.dllがクラッシュを引き起こしていたため(依存関係ウォーカーで記録)、両方の場所から削除しました。
アプリケーションが起動したので、不要なdllをすべて体系的に削除しました。
これにより、元々の状態に戻りました。
その後、アプリケーションをアンインストールして再インストールし(./platforms/qwindows.dllファイルのみを残して)、アプリケーションは正常に動作します。
したがって、プラットフォームディレクトリにqwindows.dllの誤ったバージョンがあったと推測できます。
このエラーは、プログラムがqwindows.dll
を見つけられないために発生します
qwindows.dll
はplatforms
という名前のフォルダーになければならないため、実行可能ファイルからdllへのパスはplatforms/qwindows.dll
です。
私の場合、これでは十分ではありませんでした。また、main()の先頭に次の行を追加する必要がありました
QCoreApplication::addLibraryPath("./");
その後、すべてが機能しました。
この問題とその解決方法を知りました。
必要なdllの正確なパスを確認するには、dependency walker( http://www.dependencywalker.com/ )を使用しました。 QtCreatorとQTフレームワークの両方に同じdllがあり、使用されているものを正確に特定する必要があるため、試してください。アプリと同じフォルダーに必要なすべてのdllをコピーしました。
QTフレームワーク/ pluginsからフォルダープラットフォームをコピーし、アプリと同じフォルダーにコピーしました。これで、アプリにはすべてのdllを含むplugin/platform /フォルダーも含まれました
そして、私の場合の最も重要なステップは、アプリと同じフォルダーにqt.confという名前のファイルを作成することです。このファイルには、プラグインへのパスが含まれている必要があります。私のqt.confファイルには以下が含まれています。
[パス]
ライブラリ= ../lib/qtcreator
Plugins = plugins
Imports = imports
Qml2Imports = qml
Qt bin
パスはシステムPATH
変数にあるため、アプリケーションはホストシステムで実行できます。
Qtがインストールされていないターゲットマシンでアプリケーションを実行できるように、WindowsにQtアプリケーションを展開するための標準Qtツール windeployqt
があります。
そのツールはQt DLL依存関係を処理し、platforms\qwindows.dll
のコピーを作成し、Dependency Walkerで検出できないライブラリのコピーも作成します。 、画像プラグインおよびその他のDLLが実行時にロードされるため。
環境bin
にQt PATH
フォルダーを持つ必要さえありません。最も単純な展開:
exe
バイナリを新しいフォルダーにコピーしますcmd
コンソールを開きますwindeployqt
)を使用してPATH
を呼び出し、実行可能ファイルを提供します。例:c:\Qt\Qt5.2.1\5.2.1\msvc2010_opengl\bin\windeployqt.exe application.exe
その結果、そのフォルダーには、アプリケーションを実行するために必要なすべてのQt DLLがあります。
ツールwindeployqt
にはさまざまなオプションがあります。 qml
関連ファイルの展開にも注意を払うことができます。
もちろん、MSVC再配布可能ファイルにも問題がある可能性がありますが、それらは個別に展開し、システムごとに1回インストールする必要があります。
OpenSSLなど、一部のサードパーティライブラリのみを使用する場合は、手動でコピーする必要があります。
この問題は、アプリでエンコードされているqwindows.dll
の検索パスにQtをインストールしたパスが含まれている場合にalsoが発生する可能性があることに注意してください。次のシナリオを検討してください。
c:\Qt\...
にインストールしますqwindows.dll
が含まれているため、どのコンピューターでも適切に実行されます。qwindows.dll
のc:\Qt\...
が見つかったため、結果はこのエラーになりますbeforeローカルディレクトリにあり、それと互換性がありません。とてもうるさい。
解決策は、exeファイルと同じディレクトリにqt.conf
ファイルを配置することです。これを回避する方法がわかりません。ツールwindeployqt.exe
を使用してアプリを展開した場合、platforms
というサブディレクトリがあるため、これで十分です。
[Paths]
Plugins=.
将来この問題を抱えている人々のために-私は汚い小さなハックを持っています、私のために働きました。ご自身の責任でお試しください。
初期展開(クイックおよびダーティ)のすべての手順に従ってください[ http://wiki.qt.io/Deploy_an_Application_on_Windows]
ハックのために-
ここで.exeファイルを閉じることができます。正常にデプロイされているかどうかを確認するには、インストールしたフォルダーに移動し、C:/ Qtと言い、名前をC:/ NotQtに変更します(基本的にQtをシステムから見えなくします)。現在動作している場合は、他のシステムに頻繁にデプロイされます。
私にとっては、私は 設定する必要がありますQT_QPA_PLATFORM_PLUGIN_PATH
をプラットフォームのディレクトリに移動すると、動作しました。
価値のあることは、このソリューションも GitHubで説明 でした。
以下を追加しない限り、通常はプラットフォームにあるはずのqwindows.dllがありません。
QCoreApplication::addLibraryPath("<yourpath>");
これを行わずにqwindows.dllを別の場所に置くと、QtはPATHでDLLを検索しますが、これにはかなりの時間がかかります(10秒-数分)!
同じ問題が発生しました。1。VS2010で実行できます。 2.次のようなファイルがあるフォルダーで実行できます:app.exe\platforms\qwindows.dll ...
プラットフォームフォルダーをプラグインに移動するだけで解決しました:app.exe plugins\platforms\qwindows.dll
プラス:qwindows.dllは、プラグインインターフェースでクエリされるため、好きな名前に変更できます:qt_plugin_query_metadata()
QTプラグインのプラットフォームディレクトリを指す環境変数QT_QPA_PLATFORM_PLUGIN_PATH
をシステムに追加する必要があります。私の場合、AnacondaとPySide2を使用していました。したがって、私のディレクトリパスはC:\ProgramData\Anaconda3\envs\cv\Lib\site-packages\PySide2\plugins
でした。これにより、すべてのQTプロジェクトの問題が修正されます。それ以外の場合は、プラットフォームディレクトリをすべてのQTプロジェクトにコピーします。
上記のすべてを試してみました-Qt
フォルダーにメインのapps
dllがなかったからだとわかりました
アプリケーションのexeフォルダーにqt.conf
を配置することでこれを修正しました。
[Paths]
Prefix=C:/Qt/Qt5.11.2/5.11.2/msvc2017
どこで:
C:\Qt\Qt5.11.2\5.11.2\msvc2017
にカスタムQtキットをインストールしましたqt.conf
は、Prefix
プロパティを介してカスタムキットの場所をアプリに通知します。バックスラッシュではなくスラッシュを使用してください(!)PATH
環境変数に含まれていますqt.conf
ファイルでPrefix
を定義すると、アプリの起動時にqwindows.dll
プラットフォームプラグインを見つけることができます。