Автоматическая копия зависимых файлов в 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!