Russian Qt Forum

Qt => Qt-инструментарий => Тема начата: AkonResumed от Май 18, 2020, 09:17



Название: QtCreator: неправильна интерпретация QMAKE_TARGET, QMAKE_HOST
Отправлено: AkonResumed от Май 18, 2020, 09:17
QtCreator: неправильная интерпретация QMAKE_TARGET, QMAKE_HOST

Требуется определять автоматически архитектуру и добавлять соответствующий суффикс ("-x86", "-x64" и т.п.) к выходному имени приложения или библиотеки (например, МyApp-x64.exe). Соответствующий код в pri-файле таков:
Код:
# Note: QMAKE_TARGET is empty when using Qt-v4.8.7-win32-x86-mingw32-v4.8.0-posix-dwarf.
# With Qt-v4.8.7-win32-x86-msvc2015 it is OK. Using QMAKE_TARGET as follows:
#
# contains(QMAKE_TARGET.arch, x86_64): ARCH_SUFFIX = x64
# else: ARCH_SUFFIX = $$QMAKE_TARGET.arch
#
# works fine for entire building in both Qt4 32-bit and Qt5 64-bit, but (at least) in Qt5 64-bit
# compilation single source file fails: there is 'x86' instead of 'x64' appears in makefile target
# name (object file to be compiled from source) in command line (makefiles itself are generated
# correctly). So, examine firstly QMAKE_TARGET, then QMAKE_HOST.

contains(QMAKE_TARGET.arch, x86_64): ARCH_SUFFIX = x64
else: contains(QMAKE_TARGET.arch, x86): ARCH_SUFFIX = x86
else: contains(QMAKE_HOST.arch, x86_64): ARCH_SUFFIX = x64
else: contains(QMAKE_HOST.arch, x86): ARCH_SUFFIX = x86
else {
error("Cannot determine target architecture. See ArchSuffix.pri.")
ARCH_SUFFIX = arch_unknown
}

При сборке из консоли в Windows 64-bit (qmake, nmake/mingw-make) он полностью рабочий (проверялся на Qt4 32-bit и Qt5 64-bit c MSVC и MinGW в каждом случае). QtCreator (v4.12.0 64-bit конкретно) для некоторых конфигураций разрядность определяет неправильно. Т.е., например, собираем 32-битное приложение с использованием Qt 4.8.7 32-бит: сборка из под QtCreator проходит успешно, на выходе получаем MyApp-x86.exe, но далее запуск из под QtCreator идет с ошибкой, поскольку он пытается запустить MyApp-x64.exe. QtCreator сам генерировал конфигурации сборки и запуска и для запуска неправильно сгененрировал выходное имя, т.е. неправильно обработал приведенный выше код.

Как обойти проблему?

Вообще поведение QMAKE_TARGET/QMAKE_HOST кокое-то мутное. QMAKE_TARGET иногда бывает пустым (и это корень проблемы), и приведенный выше код в этом случае делает проброс на QMAKE_HOST. Насколько это адекватно? QtCreator уже неправильно интерпретирует это.


Название: Re: QtCreator: неправильна интерпретация QMAKE_TARGET, QMAKE_HOST
Отправлено: ssoft от Май 18, 2020, 16:11
Я использую только значение QMAKE_HOST.arch, сборка с ним всегда происходит верным способом и полностью соответствует инструментарию.
Разборщик QtCreator почему-то использует свое значение QMAKE_HOST.arch, которое зависит от битности самого QtCreator.
Только поэтому приходится устанавливать одновременно 32 и 64 битные версии QtCreator и производить отладку 32 битных приложений в QtCreator 32bit, а 64 битных в QtCreator 64bit.
Другого решения не знаю.


Название: Re: QtCreator: неправильна интерпретация QMAKE_TARGET, QMAKE_HOST
Отправлено: AkonResumed от Май 20, 2020, 09:13
Оно как! Спасибо.