Сборка Qt 5 в Linux для Windows

Я хотел перенести свое приложение Qt 4 на использование Qt 5. Эти инструкции не выполнены из-за некоторых различий с тем, как MXE создает Qt 5, включая тот факт, что он использует модульные архивы Qt вместо одного большого архива.


person tshepang    schedule 05.01.2013    source источник


Ответы (4)


Вот полные инструкции:

  • Возьми:

    git clone https://github.com/mxe/mxe.git
    
  • Установите создайте зависимости

  • Соберите Qt 5 для Windows:

    cd mxe && make qtbase
    

    Это сначала создаст его зависимости и инструменты перекрестной сборки; На быстром компьютере с приличным доступом в Интернет это займет менее часа.

    Из-за новой модульной природы Qt 5 различные основные компоненты Qt теперь находятся в разных архивах. Тот, что был выбран выше, qtbase, должен предоставить вам достаточную функциональность для запуска обычных приложений с графическим интерфейсом, и это все, что мне нужно для моего собственного (небольшого) приложения.

    Если вы хотите вместо этого собрать весь Qt 5, вам нужно запустить make qt5 (вместо make qtbase). Обратите внимание, что это займет намного больше времени, поэтому убедитесь, что вам нужны дополнительные функции.

  • Перейдите в каталог вашего приложения и запустите инструмент генератора Qt Makefile:

    <mxe root>/usr/bin/i686-w64-mingw32.static-qmake-qt5
    
  • Создайте свой проект:

    make
    
  • Вы должны найти двоичный файл в каталоге ./release:

    wine release/foo.exe
    

Некоторые примечания:

  • Это было протестировано на моем 64-битном Debian 8 и, конечно же, на Windows.

  • На выходе получается 32-битный статический исполняемый файл, который будет хорошо работать в 64-битной Windows.

  • Если вам нужен 64-битный исполняемый файл, соберите Qt с помощью:

    make MXE_TARGETS=x86_64-w64-mingw32.static qtbase
    

    Значение по умолчанию MXE_TARGETS равно i686-w64-mingw32.static.

person tshepang    schedule 05.01.2013
comment
Как вы можете изменить каталоги, в которые mxe qmake выплевывает данные? У меня есть типичный qmake, создающий файлы и папки в ./build, но mxe qmake засоряет корневой каталог моего проекта - person It's Your App LLC; 23.05.2014
comment
Вы уже нашли ответ? Если нет, то я не знаю, и, возможно, задам это как отдельный вопрос. - person tshepang; 11.11.2014
comment
Обязательно используйте msys2 вместо MXE. С помощью msys2 вы можете установить готовые двоичные файлы mingw32 и mingw64 для qt с помощью одной команды pacman -S mingw32/mingw-w64-i686-qt-creator или pacman -S mingw64/mingw-w64-x86_64-qt-creator - person It's Your App LLC; 11.11.2014
comment
@MiyazawaKenji MSYS2 выглядит очень многообещающе, но не подходит для этого конкретного вопроса, поскольку работает только в Windows, а не в Linux. Помните, что MXE выполняет кросс-компиляцию библиотек. - person Nathan Osman; 04.03.2015
comment
Консольное приложение работает нормально. Но с более сложным (QtWebkit+Gui) приложение не запускается в окнах: не удалось найти или загрузить окна плагина платформы Qt - person relascope; 11.06.2015
comment
@relascope В последний раз я проверял, работает ли графический интерфейс. Может быть, что-то изменилось с тех пор. - person tshepang; 11.06.2015
comment
@Tshepang, как вы развернули приложение? ищет каждую используемую dll и копирует их в app-dir, а затем снова для плагинов? как найти зависимости? (DependencyWalker для Linux?) Есть ли в Linux Windeployqt? спасибо ... было бы неплохо собрать из Linux. на момент написания я пользуюсь vagrant и двумя виртуальными машинами: 1. WinXp+QT с запущенным windeployqt 2. WinXP для теста... - person relascope; 03.07.2015
comment
@relascope построен статически, поэтому никаких dll; вы просто развертываете, размещая один исполняемый файл где угодно. - person tshepang; 04.07.2015
comment
Не забудьте экспортировать путь $ export PATH=<mxe root>/usr/bin:$PATH - person Amit Tomar; 18.09.2015
comment
Прошло несколько лет, а ваш ответ все еще актуален и находка. Я только что протестировал его, MXE в WSL, используя qtcreator для создания статически связанных исполняемых файлов Windows и нестатических файлов Linux. Спасибо! - person Waleed Hamra; 04.04.2018
comment
Я получаю сообщение об ошибке. Нет filesystem файла или каталога. Пожалуйста помоги. - person abhiarora; 22.08.2019

Команда git checkout неверна. Теперь вам нужно получить их стабильную ветку, иначе сборка не удастся.

git clone https://github.com/mxe/mxe.git

должно быть...

git clone -b stable https://github.com/mxe/mxe.git

Это само по себе решило все мои проблемы со сборкой qtbase, но не оставило папки qt, когда это было сделано. Тогда цель qt5 потерпит неудачу с неясными ошибками. Удалил папку, проверил стабильно, работает без нареканий.

person AcidTonic    schedule 03.09.2014
comment
Я предполагаю, что это была просто временная проблема... master сейчас работает, и я на самом деле не помню, когда он вышел из строя, хотя я в основном строю qtbase, а не больший qt5. - person tshepang; 04.12.2014
comment
git clone -b stable github.com/mxe/mxe.git у меня не работает - person j35t3r; 05.01.2017
comment
@ j35t3r Я не думаю, что ветка stable больше не существует. - person Marcus; 21.07.2017

Для тех, кто напрямую хочет 64-битный скомпилированный GCC10 Qt5 (например, для файловой системы lib), вот полные инструкции:

Возьми:

git clone https://github.com/mxe/mxe.git

Установите создайте зависимости

Соберите Qt 5 для Windows с активированным плагином gcc10 64bits:

cd mxe && make MXE_TARGETS=x86_64-w64-mingw32.shared MXE_PLUGIN_DIRS=plugins/gcc10 qt5

Через 2-3 часа сборки вы можете собрать свое приложение (в вашем каталоге .pro):

<mxe root>/usr/x86_64-w64-mingw32.shared/qt5/bin/qmake

Экспортируйте путь компилятора и создайте свой проект:

export PATH=<mxe root>/usr/bin:$PATH
make

Вы должны найти двоичный файл в каталоге ./release и запустить его с помощью вина (или вина64):

wine foo.exe

Я действительно не знаю, почему, но мне нужно было добавить каталог компилятора MXE в путь вина, потому что он не мог найти библиотеки DLL:

WINEPATH="<mxe root>/usr/x86_64-w64-mingw32.shared/bin/" wine64 foo.exe 
person Sébastien L.    schedule 10.08.2020

Если вы попытаетесь сделать это, для меня работает нормально!

su
mv mxe /opt/mxe
cd /opt/mxe && make
person Ulises HybridReactor    schedule 14.02.2019