Автоматическая копия зависимых файлов в Qt Creator

Я создал программу, использующую Qt Creator 2.2.1 и Qt 4.7.4 (32 бит), выход которых является исполняемым. Открывая exe с помощью DependencyWalker, он показывает, что exe использует следующие DLL:

  • KERNEL32.DLL
  • MSVCRT.DLL
  • MINGWM10.DLL
  • LIBGCC_S_DW2-1.DLL
  • QTCORE4.DLL
  • qtgui4.dll

Я хочу, чтобы после сборки все зависимые файлы (которые могут быть разными в каком-либо другом проекте), за исключением файлов Windows (первые два в приведенном выше списке), которые будут автоматически скопированы в каталог, в котором exe.

Как я могу это сделать в Qt Creator или Qt без использования командной строки? Спасибо.

Ответ 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}

Ответ 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

Ответ 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) теперь добавлен дополнительный шаг сборки:

  • Нажмите "Добавить этап сборки"
  • Выберите "Сделать"
  • Оставьте "Override..." пустым
  • Введите "install" в "Сделать аргументы:"

Поскольку эти настройки не сохраняются вместе с файлом проекта, вам необходимо выполнить вторую часть (добавить шаг сборки) каждый раз при создании новой конфигурации сборки (например, по одному для выпуска и отладки) или проверить свой проект на новый местоположение и др.

Ответ 4

No-no-no 0_o:)

  • Создайте каталог для развертывания файлов, т.е. "bin".
  • В каждом файле .pro пишите

    DLLDESTDIR =../../myproject/bin (... некоторые dir struct...)

    QMAKE_POST_LINK = windeployqt --compiler-runtime $$ DLLDESTDIR

DLLDESTDIR - полный путь с именем файла TARGET (dll и exe).

End!