Russian Qt Forum
Ноябрь 21, 2024, 15:38 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QtCreator: неправильна интерпретация QMAKE_TARGET, QMAKE_HOST  (Прочитано 4301 раз)
AkonResumed
Чайник
*
Offline Offline

Сообщений: 81


Просмотр профиля
« : Май 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 уже неправильно интерпретирует это.
Записан
ssoft
Программист
*****
Offline Offline

Сообщений: 584


Просмотр профиля
« Ответ #1 : Май 18, 2020, 16:11 »

Я использую только значение QMAKE_HOST.arch, сборка с ним всегда происходит верным способом и полностью соответствует инструментарию.
Разборщик QtCreator почему-то использует свое значение QMAKE_HOST.arch, которое зависит от битности самого QtCreator.
Только поэтому приходится устанавливать одновременно 32 и 64 битные версии QtCreator и производить отладку 32 битных приложений в QtCreator 32bit, а 64 битных в QtCreator 64bit.
Другого решения не знаю.
Записан
AkonResumed
Чайник
*
Offline Offline

Сообщений: 81


Просмотр профиля
« Ответ #2 : Май 20, 2020, 09:13 »

Оно как! Спасибо.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.048 секунд. Запросов: 23.