Pull to refresh
91
0

Энтузиаст

Send message
Спасибо за информацию. Я статический Qt 5 (мне нужны были только QtWidgets) собирал для Windows прямо в Windows, не было под рукой машинки с дистрибутивом GNU/Linux (даже виртуальной).

В принципе, ничего сложного там тоже нет. Напишу кратенькую инструкцию в комментариях, вдруг кому-нибудь она полезной тоже окажется. Тем более, на мой взгляд, эта инструкция будет хорошим дополнением к вашей статье.

Необходимо следующее:

  1. MinGW-w64 32-bit.
    Идеальный вариант — использовать тот, что идёт в бандле Qt 5 с MinGW под Windows, наверняка этот бандл у вас уже установлен. Если нет — не забудьте отметить инструментарий MinGW при установке.
  2. Python 2.x.x.
    Он потребуется системе сборки Qt для генерации некоторых заголовочных файлов. Я использовал Python версии 2.7.9.
  3. Исходники Qt 5.


И в принципе, для Qt Widgets и QtQuick этого более чем достаточно. Далее устанавливаем Python и распаковываем архив с исходниками в удобное для сборки место. Выше по уровню создаём директорию build-Qt5-static, картина должна быть такая:

build_place/                                # Удобное для сборки место
   |
   +---build-Qt5-static                     # Тут каталог для сборки
   |
   +---qt-everywhere-opensource-src-5.4.1   # Тут исходники Qt


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

Здесь есть важный момент. Если вы хотите, чтобы исполнительны файлы ваших приложений были полностью статические и автономные, то вам необходимо отредактировать файл qt-everywhere-opensource-src-5.4.1/qtbase/mkspecs/win32-g++/qmake.conf следующим образом:

diff -Naur qt-everywhere-opensource-src-5.4.1.orig/qtbase/mkspecs/win32-g++/qmake.conf qt-everywhere-opensource-src-5.4.1/qtbase/mkspecs/win32-g++/qmake.conf
--- qt-everywhere-opensource-src-5.4.1.orig/qtbase/mkspecs/win32-g++/qmake.conf	2013-06-07 12:17:00 +0700
+++ qt-everywhere-opensource-src-5.4.1/qtbase/mkspecs/win32-g++/qmake.conf	2013-08-29 23:40:45 +0700
@@ -15,7 +15,7 @@
 TEMPLATE		= app
 CONFIG			+= qt warn_on release link_prl copy_dir_files debug_and_release debug_and_release_target precompile_header
 QT			+= core gui
-DEFINES		+= UNICODE
+DEFINES		+= UNICODE QT_STATIC_BUILD
 QMAKE_COMPILER_DEFINES  += __GNUC__ WIN32
 
 QMAKE_EXT_OBJ           = .o
@@ -32,7 +32,7 @@
 QMAKE_CFLAGS_DEPS	= -M
 QMAKE_CFLAGS_WARN_ON	= -Wall -Wextra
 QMAKE_CFLAGS_WARN_OFF	= -w
-QMAKE_CFLAGS_RELEASE	= -O2
+QMAKE_CFLAGS_RELEASE	= -O2 -Os
 QMAKE_CFLAGS_DEBUG	= -g
 QMAKE_CFLAGS_YACC	= -Wno-unused -Wno-parentheses
 
@@ -70,7 +70,7 @@
 
 QMAKE_LINK		= $${CROSS_COMPILE}g++
 QMAKE_LINK_C		= $${CROSS_COMPILE}gcc
-QMAKE_LFLAGS		=
+QMAKE_LFLAGS		= -static -static-libgcc -static-libstdc++
 QMAKE_LFLAGS_EXCEPTIONS_ON = -mthreads
 QMAKE_LFLAGS_EXCEPTIONS_OFF =
 QMAKE_LFLAGS_RELEASE	= -Wl,-s

Это «отвяжет» ваши исполнительные файлы от таких библиотек, как:

  • libgcc_s_dw2-1.dll
  • libstdc++-6.dll
  • libwinpthread-1.dll

Так как они будут влинкованы статически. На выходе получится автономный исполнительный файл, который должен запускаться и работать в любой операционной системе Windows, начиная с Windows 2000 (или XP).

Теперь, когда всё готово к конфигурированию и компиляции, можно запускать процесс. Лично я для этого воспользовался таким вот простеньким bat-сценарием, назовём его Qt5.4.1-build-static.bat:

SET QTDIR=D:\Dev\Toolkits\Qt\Qt5.4.1-static
SET PATH=D:\Dev\Toolkits\Qt\Qt5.4.1\Tools\mingw491_32\bin;D:\Dev\Toolkits\Python;D:\Dev\Toolkits\Python\Scripts;%PATH%

..\qt-everywhere-opensource-src-5.4.1\configure -opensource -release -static -confirm-license -c++11 -ltcg -no-compile-examples -no-nis -no-neon -no-iconv -no-evdev -no-mtdev -no-inotify -no-eventfd -largefile -no-fontconfig -no-system-proxies -no-icu -no-freetype -no-harfbuzz -no-angle -no-incredibuild-xge -no-plugin-manifests -rtti -strip -no-ssl -no-openssl -no-dbus -no-qml-debug -audio-backend -no-directwrite -no-direct2d -no-style-fusion -no-mp -nomake examples -nomake tools -platform win32-g++ -opengl desktop -prefix %QTDIR%

mingw32-make -j19

mingw32-make install

Объясню некоторые очевидные вещи. Переменная окружения QTDIR определяет то, куда будет установлен наш статически собранный Qt 5; исправьте эту переменную в соответствии со своими предпочтениями. Переменная окружения PATH задаёт путь до исполнительных файлов инструментария MinGW-w64 (компиляторы, линковщики, архиваторы и прочие утилиты), кроме того, в PATH определён путь до установленного Python и его скриптов. Задайте значение этой переменной в соответствии с установленным в вашу систему окружением для сборки. Далее идёт длинная команда конфигурирования (список всех параметров можно посмотреть в документации или выполнив configure.bat -help), команда сборки (опция -jX используется для распараллеливания, рекомендуемое значение зависит от характеристик вашего компьютера и рассчитывается по формуле X = N + 1, где N — число ядер вашего процессора); и завершается сценарий командой установки, которая скопирует скомпилированные библиотеки и инструменты в директорию, определённую в QTDIR.

Файл Qt5.4.1-build-static.bat, с вашими установками, кидаем в директорию build-Qt5-static и запускаем. Запускать bat-сценарий лучше всего не двойным кликом по нему, а из командной строки, чтобы иметь возможность среагировать на ошибку. Для этого: заходим с помощью проводника в директорию build-Qt5-static, и держа зажатой клавишу Shift, кликаем на пустое место в директории правой кнопкой мышки. В появившемся контекстном меню выбираем пункт «Открыть окно команд». В командной строке вводим имя bat-сценария: Qt5.4.1-build-static.bat и нажимаем клавишу Enter для запуска продолжительной процедуры сборки. Пока Qt 5 собирается можно выпить чашку кофе. Я бы даже сказал, много чашек кофе.

Небольшой совет. Если сборка завершилась с ошибкой, а вы использовали параллельную компиляцию (mingw32-make c опцией -jX), то часто возникает ситуация, что ошибка компиляции «улетела далеко наверх» и её не видно в окне и буфере командной строки. Для того, чтобы посмотреть на чём же всё-таки прервалась компиляция, достаточно повторно запустить mingw32-make без опции -jX. Через некоторое время (когда цели mingw32-make соберутся и он перейдёт на ту, что приводит к ошибке компиляции), в выхлопе появится и досадная ошибка.

Подробнее про сборку Qt 5 для Windows можно почитать официальную документацию и страничку в официальной Wiki.
Ещё напомню про такую вещь, как crosstool-ng, хорошая альтернатива MXE, если вы используете дистрибутив отличный от Gentoo.
Ну, вот и все. Теперь пересоберите свои проекты для Android и радуйтесь отображению диалога уровня звука при его регулировке.

К сожалению, не всё. Если вы обновитесь до Qt 5.4.0, то с удивлением обнаружите, что ваш костыль отвалился.
Виной тому исправление вот этого «бага»: bugreports.qt.io/browse/QTBUG-36570

Кстати, исправление весьма занятное. Теперь при нажатии клавиш VOLUME_UP и VOLUME_DOWN априори вызывается регулировка системной громкости откуда-то из недр Qt'а. И я пока не нашёл способа, как это отключить или изменить поведение нажатия клавиш на то, чтобы была возможность регулировать этот самый STREAM_MUSIC, как в посте у топикстартера. Максимум чего я добился — одновременной регулировки STREAM_MUSIC и системной громкости. Буду рад, если кто-то подскажет решение этой проблемы для Qt 5.4.0 и выше.

Здесь заходим в папку где указано имя собирателя, которым вы пользуетесь для Android (у меня это android_armv7), а далее проходим следующий путь вложенных папок: \src\android\java\src\org\qtproject\qt5\android\bindings\

Ой, зачем же так сложно?
Во-первых, править какие-либо файлы входящие в состав SDK — весьма плохой тон. Я вообще на всякий случай присваиваю этим файликам атрибут «Только для чтения».
Во-вторых, ваше решение будет затрагивать абсолютно все ваши Android-проекты на Qt, а это может иметь побочные эффекты.

Для подобных хаков в «QtActivity.java» достаточно его просто вынести в свой проект. То есть в директории вашего проекта создать каталог android/src/org/qtproject/qt5/android/bindings с похаченным файлом «QtActivity.java» и он подхватится при сборке apk-пакета.
Таким образом и овцы целы, и волки сыты SDK нетронут и девственен и вы получили то, что хотели.
А shell вы в Windows где возмёте? Винтажный cool-old-term работает поверх сильно модифицированного Linux-терминала Konsole, от которого отпилили KDE, оставив только Qt-часть. Но от этого он не стал несовместимым с POSIX, поэтому портирование cool-old-term в таком виде, в котором он сейчас представлен, на Windows будет весьма затруднительным. К слову сказать, в своё время разработчики KDE перенесли связку различных KDE-приложений для Windows, но в них так и не появился Konsole в связи со сложностью портирования. Я думаю, «малой кровью» тут не обойтись: придётся либо переписывать внутренний Konsole, заставив его работать с MSYS (оболчка shell, портированная на Windows), либо реализовывать другую библиотеку которая, например, будет работать с командной строкой (cmd.exe) отдавая в неё данные с клавиатуры и получая ответ в виде текста в окне командной строки.

Ради интереса я скомпилировал cool-old-term под Windows но, как и было ожидаемо, Konsole не работал должным образом:

image
У меня тоже Linux Mint 16 (KDE, 64-bit).
Я установил Qt 5.3.1 (полный SDK) с официального сайта qt-project.org в каталог "/opt":
Qt 5.3.1 for Linux 32-bit (447 MB)
Qt 5.3.1 for Linux 64-bit (444 MB)

Сам Qt ставится так:
$ chmod +x ~/Downloads/qt-opensource-linux-x64-5.3.1.run
$ ~/Downloads/qt-opensource-linux-x64-5.3.1.run

А дальше запускается привычный многим установщик.

Только непосредственно перед сборкой cool-old-term не забудьте добавить в переменную окружения «PATH» путь до утилит «qmake» и «qmlscene»:

$ export PATH=/opt/Qt5.3.1/5.3/gcc_64/bin/:$PATH

Всё прекрасно компилируется и работает: Screen #1, Screen #2.
Будет очень классно, если вы в своей следующей публикации затронете не только «попсовые» (Nokia N-Gage, Game Boy Advance, Nintendo DS и PlayStation Portable) портативные игровые консоли, история которых известна тут многим, но и поистине «гиковские» handheld'ы:

GP2X:
image

GP2X WIZ:
image

GP2X Caanoo:
image

Dingoo A320:
image

Pandora:
image

Да, они известны немногим и были не столь распространены, но в купе с Linux'ом на борту и доступным SDK с возможностью писать различные homebrew'шки, подобные девайсы когда-то были самой сокровенной мечтой «гиков» нулевых годов. Любой желающий мог взять SDK и портировать какой-нибудь эмулятор с «большого брата» или написать простенькую игру. Помимо этого, открывался огромный простор для исследований устройства и его операционной системы. А ещё стоит упомянуть про огромное количество платформ, которые могут эмулировать эти гаджеты:

Список платформ, которые можно эмулировать, например, на GP2X
Acorn Archimedes
Acorn BBC Micro
Amstrad CPC
Apple ][
Apple Macintosh
CPS2
MAME
MC68000/Z80 (FBA)
Atari 130XE
Atari 800/800XL
Atari 2600
Atari 5200
Atari 7800
Atari Jaguar
Atari Lynx
Atari ST
Bandai Wonderswan
Coleco Adam
ColecoVision
Commodore Amiga
Commodore Plus/4
Commodore C64
Commodore C128
Commodore CBM-II
Commodore PET
Commodore VIC-20
Game Park GP32
GCE Vectrex
IBM PC (Bochs-GP2X, DosBox, Legacy)
Magnavox Odyssey 2
Mattel Intellivision
MGT/SAM/WCC SAM Coupé
NEC PC-98
NEC PC Engine
Nintendo GameBoy (and GameBoy Color)
Nintendo GameBoy Advance
Nintendo Entertainment System
Super Nintendo Entertainment System
Sinclair ZX Spectrum
Sega Game Gear
Sega Master System
Sega Mega CD
Sega Mega Drive
SNK Neo Geo
SNK Neo Geo CD
SNK Neo Geo Pocket
Sony MSX
Sony PlayStation
Tandy Color Computer (aka. Radio Shack TRS-80)
Texas Instruments 99/4A
Texas Instruments TI-92
Thomson TO7-70
Watara Supervision
Chip8
EDSAC
J2ME


Эх, а игры, cтарые добрые игры! На эти консоли их было портировано огромное количество! Напишу небольшой список по памяти:

Wolfenstein 3D и Wolfenstein 3D: Spear of Destiny
Doom, Doom II и моды на него
Duke Nukem 3D и моды на него
Shadow Warrior
Rise of the Triad
Heretic
Hexen
Hexen II
Descent
Descent II
Aleph One
Warcraft
Abuse
Flashback
Alother the World
Quake
Quake II
Ultima 7
X-COM: Terror from the Deep for GP2X и X-COM: UFO Defense for GP2X
Transport Tycoon Deluxe
Cave Story
Ken's Labyrinth
The Legend of Zelda (roth, olb, 3t)
Baldurs Gate 1, Baldurs Gate 2, Icewind Dale 1 и Planescape Torment!
Heroes of Might and Magic II
Full Throttle via ScummVM

А вообще все и не перечислишь, так что наверняка я что-то забыл. В общем, считаю что эти устройства обязательно должны быть упомянуты. Хотя, возможно, мне следует самому написать объёмную статью касающуюся истории каждого из этих гаджетов. Я в своё время крутился в тусовке разработчиков ПО под GP2X/Dingoo, так что могу прояснить технические подробности этих устройств или какие-нибудь интересные нюансы, касающиеся разработки и портирования софта и игрушек для этих гаджетов. Информации накопилась достаточно и предавать её забвению очень жалко. Эта информация как раз умещается в рамках хаба История ИТ, возможно кому-нибудь будет интересно.
В Chrome (и, возможно, в новой Opera) для сохранения страниц в MHT нужно активировать в chrome://flags опцию «Save Page as MHTML». После перезапуска браузера можно будет сохранять страницу в MHTML (то же самое, что MHT).
В Firefox/SeaMonkey есть официальное дополнение Mozilla Archive Format, позволяющее сохранять WEB-страницы как в MHT, так и в более продвинутый MAFF.
Было бы очень интересно посмотреть на результаты проверки эмулятора PSP: PPSSPP | Github.
Эмулятор написан на C++, в данный момент активно поддерживается разработчиками.
Надеюсь, проверка PPSSPP с помощью PVS-Studio/CppCat сделает его чуточку лучше.
В настройках Qt Creator, как уже отметил snasoft.
А если вы хотите более продвинутую настройку цветовой гаммы, советую заглянуть в этот топик.
Огромное спасибо за такой полезный плагин. Несколько предложений, которые помогут его улучшить:
1. Я использую Qt Creator со своей цветовой гаммой, и лента табов в таком случае выглядит несколько инородно:

image

Есть ли возможность прочитать цвет среды, используемый пользователем и применить его к табу (1)? А фон ленты табов сделать, например, на основе цвета MenuBar'а (2). В исходниках Qt Creator можно найти функцию, отвечающую за установку цветовых градиентов GUI-элементов на основе выбранного пользователем цвета.

2. Вот этот момент хотелось бы отшлифовать:

image

Если в ленту не входят все вкладки, появляются кнопки, налезающие на её название. Быть может сделать так, чтобы кнопки никогда не накладывались на название, а были всегда рядом? На мой взгляд, так лаконичнее:

image
Upd: Оказывается, автор порта — Notaz, человек весьма известный и уважаемый в узких кругах владельцев портативных консолей от GamePark (Caanoo, WIZ) и OpenPandora. Ему не привыкать тянуть на себе очень сложные проекты, например, эмулятор PS One с динамическим MIPS->ARM recompiler; или известный многим эмулятор Sega — PicoDrive, который был портирован на все что только можно. Так что дизассемблирование такой игры не представляет особой сложности для него.
Хм… В StarCraft уже давным-давно можно было поиграть на ARM-девайсах, причем без монструозной зависимости от winelib/Winulator. Неужели автор порта не слышал о таком проекте, как Stargus?

Я это к тому, что вместо полугодового ада дизассемблирования, можно было внести лепту в открытый проект, допилить его до ума. Хотя, надеюсь, что дизассемблированный код, в частности, логика, войдет и в проект Stargus.
Владельцы Siemens SX1 могут вспомнить другую интересную игру под названием Mozzies. В ней тоже приходилось «брать ружье в руки» и отстреливать москитов с недовольными мордочками, которые весьма нагло вели себя в окружающем пространстве (через камеру смартфона, разумеется).

image image image

Mozzies, на мой взгляд, является родоначальником игр подобного типа. На выставке CeBIT 2003 был стенд, посвященный Siemens'у SX1: на нём постоянно была запущена эта игрушка и в Mozzies могли поиграть все желающие (по слухам, возле стенда даже были очереди). Несмотря на всю простоту реализации, тогда эта игра казалась весьма инновационной.
Большое спасибо за интересный пост. Ваша разработка напомнила мне весьма занимательный подход для построения простеньких мобильных приложений с UI. Этот подход когда-то был использован в смартфонах Motorola, работающих под управлением GNU/Linux. Интерфейс этих гаджетов, кстати, тоже использовал библиотеку Qt, вернее одну из ее версий для Embedded-устройств — Qt/Embedded версии 2.3.8 (библиотека Qt в то время принадлежала компании Trolltech ASA). Правда, Motorola внесла свои изменения в Qt/Embedded и дополнила библиотеку собственным фреймворком. Так вот, для упрощения разработки различных программ под эти устройства, были созданы так называемые «ShowModules», представлявшие собой простенькие C++/Qt-based программы, принимающие несколько аргументов командной строки или читающие настройки из специального файла. На основе полученных данных и строился интерфейс приложения. Создание программ и полезных утилит с помощью «ShowModules» было очень простым занятием, начинающий разработчик мог написать собственную программу используя Shell-кодинг или известный ему язык программирования, который поддерживал вызовы внешних утилит. Например, для того чтобы отобразить на экране телефона вот такой простенький диалог:

image

Нужно было всего-лишь выполнить скрипт:

#!/bin/sh
I4="Scan Complete"
I5="Your SD card is clean"
showMsg "$I4" "$I5" 2

Таким образом, с помощью набора «ShowModules» получались вполне работающие приложения с нативным интерфейсом. Например, такие:

image

Исходный код утилиты, в котором весьма просто разобраться даже новичкам. Обратите внимание, что все «ShowModules» имеют префикс «show» и несколько аргументов, отвечающих за отображаемую информацию и элементы управления.

Помимо простых интерфейсов, можно было строить и сложные. Например, с вкладками, текстовыми полями, счетчиками и другими элементами мобильного интерфейса. Обычно, утилиты, реализующие такие интерфейсы:

image

Использовали специальные конфигурационные файлы, описывающие не только UI, но и поведение программы при выборе каких-либо пунктов. Если посмотреть на файл по ссылке выше, то можно увидеть, что при выборе пункта списка «Scan SD card», будет выполнен скрипт из текущего каталога с именем «SD_scan.sh», который просканирует карту памяти.

Несмотря на то, что для этих смартфонов можно было разрабатывать приложения и на C++/Qt, разработчики довольно-таки часто использовали именно такие «костыли». Всё-таки порог вхождения в C++/Qt на этой платформе был неоправданно высок (2006(7) год, нет даже нормальных IDE для C++/Qt, полностью отсутствует необходимая документация); создание чисто нативного C++/Qt приложения требовало большого количества времени, нервов и усидчивости. Ведь нормальный SDK для этих платформ Motorola так и не выпустила, поэтому для разработки использовался любительский, с отреверсенными на коленке библиотеками, следовательно, отлов багов в приложении был тем ещё джедайством. Но это уже другая история…
Дмитрий Маликов, например, в описании сайта Stack Overflow несколько месяцев провисел.
Простите за нескромный вопрос, а что QMake такого страшного может делать с кодом? Насколько мне известно, разработка на C++/Qt не привязана к какой-либо системе сборки: если чем-то не устраивает QMake — всегда есть альтернативы в виде CMake или новоиспеченного qbs.
Большое спасибо за перевод. После прочтения топика вспомнил очень интересный рассказ Дмитрия Галушенко — «История одного байта», который, наверное, является уже классикой. Там тоже отлично передана атмосфера безысходности и безыдейности, читается история на одном дыхании.
Так или иначе, при прохождении Doom, Half-Life и даже Black Mesa у меня не возникало ощущение коридорности игры, которое сейчас сопровождает многие современные шутеры. Конечно, моё мнение сугубо индивидуально, но я думаю, что тут не я один его разделяю.

Посмотрите внимательно на приведенную вами картинку. Топологически, это прямая линия. И всё, что в игре нужно делать — это бежать вперед, отстреливаясь от монстров, иногда решая примитивные «головоломки».

Разве Doom тоже не подходит под данное вами утверждение? Объясните, почему карта Half-Life является топологически прямой линией, а карта Doom — нет?
справа — Half Life 1.

Вы это серьезно? (JPG, 2000x1930, ~737 KB)

Никогда бы не подумал, что Half-Life в понимании некоторых — коридорный шутер.

Information

Rating
4,877-th
Location
Новосибирск, Новосибирская обл., Россия
Date of birth
Registered
Activity