【问题标题】:Automatic Copy of Dependent Files in Qt CreatorQt Creator 中依赖文件的自动复制
【发布时间】:2011-07-21 03:46:17
【问题描述】:

我使用 Qt Creator 2.2.1 和 Qt 4.7.4(32 位)构建了一个程序,其输出是可执行文件。使用 DependencyWalker 打开 exe 显示该 exe 使用以下 DLL:

  • KERNEL32.DLL
  • MSVCRT.DLL
  • MINGWM10.DLL
  • LIBGCC_S_DW2-1.DLL
  • QTCORE4.DLL
  • QTGUI4.DLL

我希望在构建后所有依赖文件(在其他项目中可能不同)除了 Windows 特定文件(上面列表中的前两个)被自动复制到目录中exe所在的位置。

如何不使用命令行脚本在 Qt Creator 或 Qt 系统中执行此操作?谢谢。

【问题讨论】:

    标签: c++ qt build-automation qt-creator


    【解决方案1】:

    在 QT 5.3 中,您或许可以使用windeployqt qt 工具自动复制所需的库。

    在项目的 .pro 文件中添加以下内容应该可以解决问题,但您可能需要根据自己的具体情况进行一些调整。

    isEmpty(TARGET_EXT) {
        win32 {
            TARGET_CUSTOM_EXT = .exe
        }
        macx {
            TARGET_CUSTOM_EXT = .app
        }
    } else {
        TARGET_CUSTOM_EXT = $${TARGET_EXT}
    }
    
    win32 {
        DEPLOY_COMMAND = windeployqt
    }
    macx {
        DEPLOY_COMMAND = macdeployqt
    }
    
    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})
    
    # Use += instead of = if you use multiple QMAKE_POST_LINKs
    QMAKE_POST_LINK = $${DEPLOY_COMMAND} $${DEPLOY_TARGET}
    

    【讨论】:

    • 感谢您让我知道此功能。 :)
    • 使用时要小心。您可能很想剥离 shell 引用/路径功能,但您真的不想这样做。 Qt 喜欢使用更多 linux 风格的斜线。它可能会使您的代码看起来混乱和丑陋,但值得安全样板。
    • 谢谢它的工作。但是有没有办法让“make clean”删除这个复制的特定文件?我想我当然可以删除整个目录 - 只是想知道是否还有其他方法。
    • 绝招。请注意,如果 ...deployqt 程序不在 PATH 中,这将不起作用。在 Qt Creator 中,它将位于路径中,但如果 qmake 从 shell 运行,则可能不在路径中。建议:DEPLOY_COMMAND = $$shell_quote($$shell_path($$[QT_INSTALL_BINS]\windeployqt)) 和类似的 macdeployqt。
    • 我在我的 pro 文件中添加,应用程序不显示错误,但无法在 windows 内呈现任何内容。
    【解决方案2】:

    我会为项目修改您的 *.pro 文件并使用 INSTALLS。要真正移动文件,您需要运行make install。在 Qt Creator 中,您可以通过进入“项目”部分并添加新的构建步骤将其添加为正常构建过程的一部分。

    ## This sets MY_LIB_FILES the libs you want and should also correctly resolve
    ## the location of the libs.
    
    win32 {                ## For Windows builds
        # Note: Check to make sure of file name case
    
        MY_LIB_FILES += $$QMAKE_LIBDIR_QT/MINGWM10.DLL
        MY_LIB_FILES += $$QMAKE_LIBDIR_QT/LIBGCC_S_DW2-1.DLL
        MY_LIB_FILES += $$QMAKE_LIBDIR_QT/QTCORE4.DLL
        MY_LIB_FILES += $$QMAKE_LIBDIR_QT/QTGUI4.DLL
    }
    
    unix {                     ## For unix builds
        # MY_LIB_FILES += $$QMAKE_LIBDIR_QT/...xxxxxx....
    }
    
    ## Define what files are 'extra_libs' and where to put them
    extra_libs.files = MY_LIB_FILES
    extra_libs.path = $$DESTDIR
    
    ## Tell qmake to add the moving of them to the 'install' target
    INSTALLS += extra_libs
    

    【讨论】:

    • 我认为他的问题的复杂部分是关于依赖文件 ...自动
    • 我无法让它工作。 Windows 7 Ultimate 中的make install 替代品是什么?
    • 我尝试了mingw32-make installqmake install,但都不起作用。
    • @Donotaio 您应该使用与构建代码相同的“make”实用程序(或与 QtCreator 调用的相同)。如果您使用nmake 构建代码,请使用nmake install
    • @Donotalo 我也遇到了 make install 的问题,它什么也没做。那是因为你需要自己设置 $$DESTDIR,看这个帖子:stackoverflow.com/a/13168238/62921
    【解决方案3】:

    即使不是完全自动的,您也可以使用 QtCreator 轻松完成您想做的事情。

    将“INSTALLS”指令添加到您的项目 (.pro) 文件中(类似于 jwernerny 的建议):

    win32 {
        libstocopy.files = $$QMAKE_LIBDIR_QT/MINGWM10.DLL \
           ... (add other files)
    }
    
    # If using MSVC the code may end up in "release" or "debug" sub dir
    # Remove this if that is not the case
    win32 {
        CONFIG(debug, debug|release): OUTDIR = debug
        else: OUTDIR = release
    }
    
    libstocopy.path = $$OUT_PWD/$$OUTDIR
    INSTALLS += libstocopy
    

    现在,在 QtCreator(我的版本=2.4.1)的“项目”选项卡中添加一个额外的构建步骤:

    • 点击“添加构建步骤”
    • 选择“制作”
    • 将“覆盖...”留空
    • 在“Make arguments:”中输入“install”

    由于这些设置没有与您的项目文件一起保存,因此您必须在每次创建新的构建配置(例如发布和调试各一个)时执行第二部分(添加构建步骤)或将您的项目签出到新的位置。

    【讨论】:

      【解决方案4】:

      不,不,0_o :)

      1. 创建一些目录来部署文件,即“bin”。
      2. 在每个 .pro 文件中写入

        DLLDESTDIR = ../../myproject/bin (...一些目录的结构...)

        QMAKE_POST_LINK = windeployqt --compiler-runtime $$DLLDESTDIR

      DLLDESTDIR -- 文件名为 TARGET(dll 和 exe)的完整路径。

      结束!

      【讨论】:

      • 您可以添加一些解释,说明他们为什么要这样做。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-26
      • 1970-01-01
      • 1970-01-01
      • 2010-11-29
      相关资源
      最近更新 更多