web-dev-qa-db-ja.com

QtランタイムDLLをプロジェクト出力にコピーする方法

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 ファイルを提供する場合を除いて、このツールの使用は基本的に必須です。 。

31
James Johnston

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.)
}

これが私がそれについて好きではないことのいくつかです:

  • %QTDIR%環境変数を使用します。この変数は、copyコマンドが実際に実行されるまで評価されません。 QMAKE_LIBS_QT_DLL のようなものの方が適切なようですが、何らかの理由でそれを機能させることができませんでした。
  • ハードコードされた「デバッグ」および「リリース」名。そのために使用する何らかの変数があるはずのようです。
  • 「copy」コマンドを使用して環境に呼び出します。

誰かがこれを少し短くするか、私の懸念のいくつかに対処するか、または単に一般的により良い方法を見つけることによって、これを少しきれいにすることができれば、私は別の答えを受け入れます。

8
James Johnston

少しクリーンな方法ですが、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に配置されないことに気づきました。理由はよくわかりません。

7
jwernerny

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()をご覧ください。依存関係の識別には、dumpbinobjbinlddotoolを使用します。

参照: https://cmake.org/cmake/help/v3.0/module/GetPrerequisites.html

6
Jens A. Koch

私は同じ問題に遭遇し、 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を使用する必要があります。

4
ForceMagic