Qt Creatorで作成された簡単なプロジェクトがあります(Qt SDK 1.1.4を使用してインストールされています)。 Qt Creator内からは問題なく動作しますが、Windowsで出力ディレクトリを参照し、EXEをダブルクリックすると、次のようなエラーが発生します。
The program can't start because QtCored4.dll is missing from your computer.
Try reinstalling the program to fix this problem.
これは明らかに、QtがPATHに含まれておらず(コンピューターに複数のバージョンのQtがある場合に備えて、Qtを含めたくない)、Qt Creator/qmakeがQtDLLをプロジェクト出力にコピーしなかったためです。 。
私がやりたいのは、qmakeを使用して、必要なQtファイルをプロジェクトの出力ディレクトリにコピーすることです。どうすればよいですか?
(qmakeでカスタムターゲットを作成しようとしましたが、それほど遠くはありません...)
更新2016年7月19日:明確にするために、上記の投稿はQt4に関するものでした。 Qt5では、代わりに windeployqt
の呼び出しを検討する必要があります。このQt5ツールは、バイナリを読み取り、必要なQt5ランタイムファイルを決定し、それらをバイナリディレクトリにコピーします。また、PCに固有のQt5 :: Coreライブラリの絶対パスが修正されることにも注意してください。したがって、自分で qt.conf
ファイルを提供する場合を除いて、このツールの使用は基本的に必須です。 。
OK、これが醜いハックです:
# Copy required DLLs to output directory
CONFIG(debug, debug|release) {
QtCored4.commands = copy /Y %QTDIR%\\bin\\QtCored4.dll debug
QtCored4.target = debug/QtCored4.dll
QtGuid4.commands = copy /Y %QTDIR%\\bin\\QtGuid4.dll debug
QtGuid4.target = debug/QtGuid4.dll
QMAKE_EXTRA_TARGETS += QtCored4 QtGuid4
PRE_TARGETDEPS += debug/QtCored4.dll debug/QtGuid4.dll
} else:CONFIG(release, debug|release) {
QtCore4.commands = copy /Y %QTDIR%\\bin\\QtCore4.dll release
QtCore4.target = release/QtCore4.dll
QtGui4.commands = copy /Y %QTDIR%\\bin\\QtGui4.dll release
QtGui4.target = release/QtGui4.dll
QMAKE_EXTRA_TARGETS += QtCore4 QtGui4
PRE_TARGETDEPS += release/QtCore4.dll release/QtGui4.dll
} else {
error(Unknown set of dependencies.)
}
これが私がそれについて好きではないことのいくつかです:
誰かがこれを少し短くするか、私の懸念のいくつかに対処するか、または単に一般的により良い方法を見つけることによって、これを少しきれいにすることができれば、私は別の答えを受け入れます。
少しクリーンな方法ですが、make
の後にmake install
を実行する必要があります。 Windowsでも動作しますが、他のプラットフォーム用に調整する必要があります。
debug { DESTDIR = debug }
release { DESTDIR = release }
debug_and_release { DESTDIR = bin }
myqtlibs.path = $$DESTDIR
myqtlibs.files = $$QMAKE_LIBDIR_QT/*.dll junk.txt fred.out
myqtlibs.CONFIG = no_check_exist
INSTALLS += myqtlibs
Qmakeがデバッグのためだけに実行される場合、すべての出力は./debugに送られます。リリース専用の場合、すべての出力は./releaseになります。両方の場合、。/ binに。
QtCreatorでシャドウ構築を有効にすると、実行可能ファイルがDESTDIRに配置されないことに気づきました。理由はよくわかりません。
windeployqtで依存関係をコピーします
_# Deployment - Automatically Detect and Copy Dependencies to Build Folder
TARGET_CUSTOM_EXT = .exe
DEPLOY_COMMAND = windeployqt
DEPLOY_OPTIONS = "--no-svg --no-system-d3d-compiler --no-opengl --no-angle --no-opengl-sw"
CONFIG( debug, debug|release ) {
# debug
DEPLOY_TARGET = $$Shell_quote($$Shell_path($${OUT_PWD}/debug/$${TARGET}$${TARGET_CUSTOM_EXT}))
DEPLOY_OPTIONS += "--debug"
} else {
# release
DEPLOY_TARGET = $$Shell_quote($$Shell_path($${OUT_PWD}/release/$${TARGET}$${TARGET_CUSTOM_EXT}))
DEPLOY_OPTIONS += "--release"
}
# Uncomment the following line to help debug the deploy command when running qmake
#message($${DEPLOY_COMMAND} $${DEPLOY_OPTIONS} $${DEPLOY_TARGET})
QMAKE_POST_LINK = $${DEPLOY_COMMAND} $${DEPLOY_OPTIONS} $${DEPLOY_TARGET}
_
または依存関係を手動でコピーします
_# Deployment - Copy Dependencies to Build Folder
dlls.path = $${DESTDIR}
dlls.files += $$[QT_INSTALL_BINS]/icudt51.dll
dlls.files += $$[QT_INSTALL_BINS]/icuin51.dll
dlls.files += $$[QT_INSTALL_BINS]/icuuc51.dll
dlls.files += $$[QT_INSTALL_BINS]/libgcc_s_dw2-1.dll
dlls.files += $$[QT_INSTALL_BINS]/libstdc++-6.dll
dlls.files += $$[QT_INSTALL_BINS]/libwinpthread-1.dll
dlls.files += $$[QT_INSTALL_BINS]/Qt5Core.dll
dlls.files += $$[QT_INSTALL_BINS]/Qt5Network.dll
dlls.files += $$[QT_INSTALL_BINS]/Qt5Gui.dll
dlls.files += $$[QT_INSTALL_BINS]/Qt5Widgets.dll
dllA.path += $${DESTDIR}/platforms
dllA.files += $$[QT_INSTALL_PLUGINS]/platforms/qwindows.dll
dllB.path += $${DESTDIR}/plugins/imageformats/
dllB.files += $$[QT_INSTALL_PLUGINS]/imageformats/qico.dll
dllB.files += $$[QT_INSTALL_PLUGINS]/imageformats/qwbmp.dll
INSTALLS += dlls dllA dllB
_
参照: http://doc.qt.io/qt-5/qmake-variable-reference.html#deployment
クロスプラットフォームの前提条件/依存関係を特定する必要がある場合は、CMakeのgetPrerequisites()
をご覧ください。依存関係の識別には、dumpbin
、objbin
、ldd
、otool
を使用します。
参照: https://cmake.org/cmake/help/v3.0/module/GetPrerequisites.html
私は同じ問題に遭遇し、 jwernernyの解決策 は私を大いに助けてくれました。ただし、Windows7でShadowBuildを使用していたため、もう少し調整が必要でした。
また、現在の構成に従ってDESTDIR
を設定する必要がありました。
私の場合、*.qml
ファイルをコピーしたかったので、それを実現しました。
CONFIG(release, debug|release): DESTDIR = $$OUT_PWD/release
CONFIG(debug, debug|release): DESTDIR = $$OUT_PWD/debug
QmlFiles.path = $$DESTDIR/Qml
QmlFiles.files += $$files(Qml/*.qml)
INSTALLS += QmlFiles
編集:
Shadow Buildを使用しているので、出力フォルダーを取得するには$$OUT_PWD
を使用する必要があります。