19 grudnia 2012

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.

Pliki cookies

Uwaga! Strona wykorzystuje do działania pliki cookies, które są zbierane między innymi w celach reklamowych oraz statystycznych, a także dla poprawy wygody korzystania z serwisu. Jeżeli nie zgadzasz się z tym wyłącz opcję w przeglądarce. Więcej informacji