Это (особенно в Windows) распространенная проблема.При установке Qt SDK вы получите как минимум 2 .dll с тем же именем, но в разных версиях.Бывает, что вы ссылаетесь на предназначенную (dev-) библиотеку, но во время выполнения используется версия из Designer / Creator.
Самый простой способ избежать этого - развернуть правильную версию библиотеки DLL вместе.с вашими двоичными файлами (.exe и прочее) в отдельной папке.Это может быть достигнуто путем изменения вашего сценария сборки.Это зависит от вашей системы сборки, которая обычно является qmake / .pro или cmake / CMakeLists.txt.
Что касается CMake, учитывая переменную окружения MYQTDLLDIR
, содержащую путь к файлам для развертывания, вы можете использовать что-тонапример:
configure_file($ENV{MYQTDLLDIR}/QtCore4.dll ${CMAKE_CURRENT_BINARY_DIR} COPYONLY)
configure_file($ENV{MYQTDLLDIR}/QtGui4.dll ${CMAKE_CURRENT_BINARY_DIR} COPYONLY)
документация извлечена из cmake --help-full
:
configure_file Скопируйте файл в другое место и измените его содержимое.
configure_file ([COPYONLY] [ESCAPE_QUOTES] [@ONLY])
Копирует файл в файл и подставляет значения переменных, указанные в содержимом файла.Если это относительный путь, он оценивается относительно текущего исходного каталога.Должен быть файлом, а не каталогом.Если это относительный путь, он оценивается относительно текущего двоичного каталога.Если имя существующего каталога указано, входной файл помещается в этот каталог с его исходным именем.
Эта команда заменяет любые переменные во входном файле, на которые ссылаются как $ {VAR} или @ VAR @, на их значения, определенные CMake.,Если переменная
не определена, она будет заменена ничем.Если указано
COPYONLY, то расширение переменной не будет.Если указано ESCAPE_QUOTES, то любые замещенные кавычки будут экранированы в стиле C.Файл будет настроен с текущими значениями переменных CMake.Если задано @ONLY, только переменные вида @ VAR @
будут заменены, а $ {VAR} будет игнорироваться.Это полезно для
настройки сценариев, которые используют $ {VAR}.Любые вхождения #cmakedefine VAR будут заменены либо #define VAR, либо / * #undef VAR * /
в зависимости от настройки VAR в CMake.Любые вхождения
# cmakedefine01 VAR будут заменены либо #define VAR 1, либо #define VAR 0> в зависимости от того, оценивает ли VAR значение TRUE или FALSE в CMake
Что касается qmake, вы можете использоватьINSTALLS
(используется при вызове make install
) или выполнить «простую команду» после компоновки.Использование INSTALLS :
mytarget.path = /output/path
mytarget.files += /path/to/QtCore4.dll
mytarget.files += /path/to/QtGui4.dll
INSTALLS += mytarget
qmake с использованием выполнения команды:
win32 {
EXTRA_BINFILES += \
$${MYQTDLLDIR}/QtCore4.dll \
$${MYQTDLLDIR}/QtGui4.dll
EXTRA_BINFILES_WIN = $${EXTRA_BINFILES}
EXTRA_BINFILES_WIN ~= s,/,\\,g
DESTDIR_WIN = $${DESTDIR}
DESTDIR_WIN ~= s,/,\\,g
for(FILE,EXTRA_BINFILES_WIN){
QMAKE_POST_LINK +=$$quote(cmd /c copy /y $${FILE} $${DESTDIR_WIN}$$escape_expand(\n\t))
}
}