Krzyżowa kompilacja projektu w QT

Od jakiegoś czasu ciekawiła mnie kompilacja pod Linuxem programów dla Windowsa. Przeglądając repozytorium Debiana zauważyłem znajomy pakiet mingw. Przeczytałem jego opis i zainstalowałem. Kompilowanie prostych programów (nie wymagających żadnych zewnętrznych bibliotek) działało w porządku. Problemem jednak, który postanowiłem rozwiązać była kompilacja projektu napisanego w QT. Chciałem, aby na moim Debianie kompilator, bez używania żadnych wine’ów, „wypluwał” pliki EXE.

W zeszły weekend, mając chwilę wolnego czasu postanowiłem pokombinować trochę z ustawieniami QT Creatora. Kiedy to zawiodło rozpocząłem internetowe poszukiwania metody dokonania takiej krzyżowej kompilacji. Właściwie to jest słowo klucz, przez którego nieznajomość zmarnowałem kilkadziesiąt minut. W końcu coś znalazłem na zagranicznych forach. Poniższy tekst jest między innymi efektem tych udanych poszukiwań – brakowało mi tekstu w języku polskim na ten temat ; )

0. Przyjęte Założenia: 


/usr/share/qt4 – ścieżka QT
/usr/bin/i686-w64-mingw32-gcc – ścieżka kompilatora mingw-gcc
/usr/bin/i686-w64-mingw32-g++ – ścieżka kompilatora mingw-g++
/usr/i686-w64-mingw32/include – katalog include kompilatora mingw-gcc
/usr/share/qt4/win – katalog, do którego przenosisz pliki Windowsowego QT

/usr/bin/qmake – ścieżka QMake

1. Instalujemy MINGW

# apt-get install g++-mingw-w64 g++-mingw-w64-i686 g++-mingw-w64-x86-64 gcc-mingw-w64 gcc-mingw-w64-base gcc-mingw-w64-i686 gcc-mingw-w64-x86-64 gcc-mingw32


2. Kopiujemy pliki z Windowsowego QT

Foldery lib, include, src z Windowsowego QT należy przekopiować np. do katalogu /usr/share/qt4/win/

3. Dokonujemy edycji pliku konfiguracyjnego wykorzystywanego przez QMake

# cd /usr/share/qt4/win/mkspecs
# cp -r win32-g++ win32g++
# nano qmake.conf

Zmieniamy wartości poniższych zmiennych na nowe:
QMAKE_CC = /usr/bin/i686-w64-mingw32-gcc
QMAKE_CXX = /usr/bin/i686-w64-mingw32-g++
QMAKE_LINK = /usr/bin/i686-w64-mingw32-g++
QMAKE_LINK_C = /usr/bin/i686-w64-mingw32-gcc

QMAKE_INCDIR= /usr/i686-w64-mingw32/include
QMAKE_INCDIR_QT = /usr/share/qt4/win/include
QMAKE_LIBDIR_QT = /usr/share/qt4/win/lib

QMAKE_LFLAGS            += -static-libgcc
QMAKE_LFLAGS            += -static-libstdc++

QMAKE_MOC= moc
QMAKE_UIC = uic
QMAKE_IDC = idc

4. Kompilujemy nasz projekt

Przechodzimy do katalogu z plikami naszego projektu i wydajemy komendę:
# qmake -spec win32g++
# make

Edit (24.12.12): Rzecz jasna trzeba pamiętać o umieszczeniu w folderze z plikiem wykonywalnym plików bibliotek: QtGui4.dll, QtCore4.dll, mingwm10.dll, libgcc_s_dw2-1.dll.

“Ramami formalnymi państwa jest jego Konstytucja. Przestrzeganie ścisłej konstytucyjności zarówno przez władze państwowe, jak i obywateli, jest niezbędnym warunkiem zachowania ciągłości prawnej naszego Państwa. Gdy materialne momenty w istnieniu naszej państwowości zostały naruszone i osłabione, tym większe znaczenie przypada momentowi idealnemu – momentowi prawnemu. To jest ta więź, która obok czynników moralnych, poczucia narodowego, łączy rozproszonych po całym świecie Polaków.”

Wacław Tytus Komarnicki

Przedwojenny prawnik, działacz polityczny