Кросс-компиляция приложения на C++ с Qt с Linux под Windows

356
05 октября 2017, 13:38

Здравствуйте! Я начинающий программист и недавно использую Qt. Не могу разобраться с компиляцией приложения на C++ с использованием Qt. Написал простейшую программу под Linux Mint:

#include <QtGui>
#include <QWidget>
#include <QTimer>
#include <QPoint>

int main(int argc, char **argv)
{
    QApplication app(argc, argv);
    return app.exec();
}

хочу получить .exe. Для этого пытаюсь следовать инструкции отсюда:

https://askubuntu.com/a/656329

Как я понял, там пропущен один шаг. Я делаю так:

PATH=<mxe root>:$PATH
export PATH
<mxe root>/usr/bin/i686-w64-mingw32.static-qmake-qt5 -project

Здесь у меня возникает ошибка

Project ERROR: Cannot run compiler 'i686-w64-mingw32.static-g++'. Maybe you forgot to setup the environment?

Но я её игнорирую и продолжаю:

<mxe root>/usr/bin/i686-w64-mingw32.static-qmake-qt5
make

При этом, сразу запустить qmake без -project нельзя, он мне справку выдаёт. А вот после make у меня возникает ошибка:

make[1]: i686-w64-mingw32.static-g++: Command not found

С ней я разобрался. Надо в Makefile.Release заменить строчки

CXX         = i686-w64-mingw32.static-g++
LINKER      = i686-w64-mingw32.static-g++

на

CXX         = <mxe root>/usr/bin/i686-w64-mingw32.static-g++
LINKER      = <mxe root>/usr/bin/i686-w64-mingw32.static-g++

Но теперь появляется ошибка, которую я уже побороть не могу:

fatal error: QWidget: No such file or directory

Подскажите, пожалуйста, что мне делать. И, если возможно, объясните, почему ещё в том ответе опущена строчка

<mxe root>/usr/bin/i686-w64-mingw32.static-qmake-qt5 -project

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

Answer 1

Делать надо так:

0) Как сказано в ответе https://askubuntu.com/a/656329, надо:

git clone https://github.com/mxe/mxe.git
cd mxe && make qtbase

1) Добавить в test.cpp строчку

#include <QtWidgets>

2) Потом

PATH=<mxe root>:$PATH
export PATH
<mxe root>/usr/bin/i686-w64-mingw32.static-qmake-qt5 -project
<mxe root>/usr/bin/i686-w64-mingw32.static-qmake-qt5

игнорируя возникающую после /usr/bin/i686-w64-mingw32.static-qmake-qt5 -project ошибку

3) Потом дописать в файл test.pro строку

QT += widgets

после строки INCLUDEPATH += .

4) Выполнить

make

Он завершится с ошибкой, но это не конец.

5) Заменить в Makefile.Release

CXX = i686-w64-mingw32.static-g++
LINKER  = i686-w64-mingw32.static-g++

на

CXX = <mxe root>/usr/bin/i686-w64-mingw32.static-g++
LINKER  = <mxe root>/usr/bin/i686-w64-mingw32.static-g++

6) Снова выполнить

make

И в папке release образуется test.exe

Если в мой C++ файл добавить строки

QWidget w;
w.show();

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

READ ALSO
Как можно изменить код?

Как можно изменить код?

Задание:Структура с именем TRAIN поля: -название пункта назначения; -номер поезда; -время отправления Способ обработки – вывод на дисплей результата...

313
Нужно убрать первый символ строки

Нужно убрать первый символ строки

Есть программа, которая в цикле сравнивает строки, всё в ней работает, но в итоге превышается тайм лимит на 0,001 - 0,007 секундыРешил с каждой итерацией...

246
Как сделать таймер на C++

Как сделать таймер на C++

Делаю игру змейку, изучая ООП C++, и есть код:

295
Считывание unicode

Считывание unicode

Имеется адрес в котором хранится строка в UTF-16Вопрос как ее нормально считать в массив char с помощью ReadProcessMemory? Я пытался вот так:

243