首页 文章

如何将Qt运行时DLL复制到项目输出

提问于
浏览
28

我有一个在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 Creator / qmake没有将Qt DLL复制到项目输出 .

我想要做的是使用qmake将必要的Qt文件复制到项目输出目录 - 无论它在哪里 . 我该怎么做呢?

(我尝试在qmake中创建一个自定义目标,但我不会太过分......)

UPDATE July 19, 2016: 为了澄清,上述帖子与Qt4有关 . 在Qt5上,您应该考虑调用windeployqt . 此Qt5工具将读取您的二进制文件,确定您需要哪些Qt5运行时文件,并将它们复制到二进制目录 . 另请注意,它将修复Qt5 :: Core库中特定于PC的绝对路径 - 因此,除非您想自己提供qt.conf文件,否则使用此工具基本上是强制性的 .

4 回答

  • 4

    好的,这是一个丑陋的黑客:

    # 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%环境变量;在实际运行复制命令之前,不会评估此变量 . 看起来像QMAKE_LIBS_QT_DLL这样的东西会更合适,但由于某些原因我无法使其工作 .

    • 硬编码"debug"和"release"名称;似乎应该有某种变量用于此 .

    • 使用"copy"命令调用环境 .

    我会接受另一个答案,如果有人可以清理这一点,例如缩短它和/或解决我的一些问题,或者只是找到更好的方法 .

  • 5

    一个更清洁的方法,但它需要在 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

    Copy Dependencies with windeployqt

    # Deployment - Automatically Detect and Copy Dependencies to Build Folder
    
    TARGET_CUSTOM_EXT = .exe
    DEPLOY_COMMAND = windeployqt
    
    CONFIG( debug, debug|release ) {
        # debug
        DEPLOY_TARGET = $$shell_quote($$shell_path($${OUT_PWD}/debug/$${TARGET}$${TARGET_CUSTOM_EXT}))
    } else {
        # release
        DEPLOY_TARGET = $$shell_quote($$shell_path($${OUT_PWD}/release/$${TARGET}$${TARGET_CUSTOM_EXT}))
    }
    
    # Uncomment the following line to help debug the deploy command when running qmake
    #warning($${DEPLOY_COMMAND} $${DEPLOY_TARGET})
    
    QMAKE_POST_LINK = $${DEPLOY_COMMAND} $${DEPLOY_TARGET}
    

    Copy dependencies manually

    # 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

  • 8

    我遇到了同样的问题,jwernerny's solution给了我很多帮助 . 但是,我在Window 7上使用了Shadow Build,它需要更多的tweeking .

    我还需要根据当前配置设置 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
    

    EDIT :

    由于我使用Shadow Build,我需要使用 $$OUT_PWD 来获取输出文件夹 .

相关问题