Автоматическое копирование зависимых файлов в 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 (первые два в приведенном выше списке), автоматически копировались в каталог, в котором находится исполняемый файл. .

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


person Donotalo    schedule 21.07.2011    source источник


Ответы (4)


В 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}
person Scott Marchant    schedule 07.08.2014
comment
Спасибо, что сообщили мне об этой функции. :) - person Donotalo; 09.08.2014
comment
Будьте осторожны при использовании. У вас может возникнуть соблазн лишить функциональность кавычек / пути оболочки, но вы действительно не хотите этого делать. Qt любит использовать слэши в стиле Linux. Это может сделать ваш код беспорядочным и уродливым, но это стоит шаблона безопасности. - person kayleeFrye_onDeck; 18.03.2016
comment
Спасибо, это работает. Но есть ли способ заставить make clean удалить определенные файлы, которые она копирует? Думаю, я мог бы, конечно, удалить весь каталог - просто интересно, есть ли другой подход. - person Zitrax; 21.09.2016
comment
Отличный трюк. Обратите внимание, что это не сработает, если программа ... deployqt не указана в PATH. В Qt Creator он будет в пути, но его может не быть, если qmake запускается из оболочки. Предложение: DEPLOY_COMMAND = $$shell_quote($$shell_path($$[QT_INSTALL_BINS]\windeployqt)) и аналогичные для macdeployqt. - person Pat; 30.11.2016
comment
Я добавил в свой профессиональный файл, что приложение не показывает ошибку, но не может ничего отображать в окнах. - person nobjta_9x_tq; 16.05.2020

Я бы изменил ваш * .pro файл для проекта и использовал УСТАНАВЛИВАЕТ. Чтобы действительно вызвать перемещение файлов, вам нужно будет запустить 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
person jwernerny    schedule 21.07.2011
comment
Я думаю, что сложная часть его вопроса будет делать это автоматически в отношении зависимых файлов ... - person Thomas Vincent; 21.07.2011
comment
Я не могу заставить это работать. Что такое make install альтернатива в Windows 7 Ultimate? - person Donotalo; 23.07.2011
comment
Я пробовал mingw32-make install и qmake install, но ни один из них не работал. - person Donotalo; 23.07.2011
comment
@Donotaio Вы должны использовать ту же утилиту make, что и для построения вашего кода (или ту же самую, что вызывает QtCreator). Если вы создаете свой код с nmake, используйте nmake install. - person jwernerny; 24.07.2011
comment
@Donotalo У меня также была проблема с make install, которая просто ничего не делала. Это потому, что вам нужно установить $$ DESTDIR самостоятельно, см. Эту ветку: stackoverflow.com/a/13168238/62921 - person ForceMagic; 01.11.2012
comment
Я заметил одну вещь: строка extra_libs.files = MY_LIB_FILES не может работать, потому что переменная MY_LIB_FILES не разрешается. Для разрешения переменных необходимо использовать двойные знаки доллара ($$): $$MY_LIB_FILES. Итак, строка становится: extra_libs.files = $$MY_LIB_FILES. Просто если кто-то решит принять ответ ... - person goulashsoup; 12.07.2018

Несмотря на то, что это не полностью автоматический процесс, вы можете без особых усилий делать то, что хотите, с 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) вы теперь добавляете дополнительный шаг сборки:

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

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

person jmidgren    schedule 30.11.2012

No-no-no 0_o :)

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

    DLLDESTDIR = ../../myproject/bin (... некоторая структура каталога ...)

    QMAKE_POST_LINK = windeployqt --compiler-runtime $$ DLLDESTDIR

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

Конец!

person Виктор А.    schedule 04.08.2015
comment
Вы можете добавить объяснение, почему они должны это сделать. - person Dominique McDonnell; 04.08.2015