HOWTO MinGW und SDL CrossCompiler
Aus Gentoo Linux Wiki
| Installationsmethoden • LiveCDs • Kernel & Hardware • Laptops & Notebooks • Portage • System • Netzwerke & Services • X • Software • Anderes • alphabetischer HOWTO Index |
Inhaltsverzeichnis |
[Bearbeiten] Wie man eine Linux->Windows Cross-Compiling-Umgebung einrichtet mit MinGW32, SDL undKDevelop
[Bearbeiten] Abstract
Dieses HowTo zeigt, wie man MinGW32, SDL und KDevelop einrichten muss, damit man mit einem einzigen Klick zwischen Linux- und Windows-Targets wechseln kann.
[Bearbeiten] Ein Cross-Compiler muss her...
Der erste Schritt zur eigenen Cross-Compiling-Umgebung ist die Installation einer Toolchain, die Win32-Binär-Dateien erzeugen kann.
[Bearbeiten] ..unter Verwendung von emerge
emerge -va sys-devel/crossdev
Das installiert crossdev, ein kleines Utility, das die Aufgabe übernimmt die Toolchain zu installieren, und die Nachfolge der xmingw-ebuilds übernommen hat. Als nächstes braucht man ein Portage-Overlay, wo crossdev seine ebuilds unterbringen kann. Es wird angenommen, das du noch kein Overlay verwendest. Falls doch, schau hier. Um ein Overlay hinzu zufügen, führe
echo 'PORTDIR_OVERLAY="/usr/local/portage"' >> /etc/make.conf
aus. Wenn du das Overlay angelegt hast, und die entsprechenden Verzeichnisse erzeugt hast, führe
crossdev -t i686-mingw32
aus. Das installiert eine aktuelle Toolchain nach /usr/. Die Bibliotheken und Include-Dateien werden nach /usr/i686-mingw32/usr installiert. Der Compiler wird nach /usr/i686-pc-linux-gnu/i686-mingw32/gcc-bin/4.2.0 installiert. In den Gentoo Foren findet sich der Hinweis, das die Unterstützung für exception-handling in shared libraries im Zusammenspiel von MinGW32 und gcc-4 im Moment nicht funktioniert. Solltest du auf diese Funktionalität angewiesen sein, solltest du deine Toolchain mit
crossdev --gcc 3.4.2 -t i686-mingw32
erzeugen.
Es kann sein, dass crossdev bei einer der gcc-stages mit folgender Fehlermeldung im build-log abbricht:
_error_not_here_yet: Command not found
Hier müssten folgende Befehle Abhilfe schaffen:
EXTRA_ECONF="--enable-languages=c" crossdev -t i686-mingw32 -s1 EXTRA_ECONF="--enable-languages=c,c++" crossdev -t i686-mingw32 -s4
Dies sollte gcc und den Rest der toolchain in zwei Schritten erfolgreich kompilieren. (Für weitere Infos siehe hier)
Crossdev erzeugt eine neue Portage-Kategorie nach dem Schema 'cross-arch-target' (z.B. 'cross-i686-mingw32'), so dass sich die einzelnen Komponenten gezielt entfernen lassen:
emerge -Ca =cross-i686-mingw32/gcc-3.4.6-r2
Ein komplettes Set lässt sich entfernen mit:
crossdev -C i686-mingw32
[Bearbeiten] ..unter Verwendung von paludis
# die Verwendung von contrarius wird momentan noch nicht empfohlen..
# wechsle also in dein lokales repository, führe folgendes aus
cd ${YOUR_LOCALREP}
mkdir -p cross-i686-pc-mingw32
echo cross-i686-pc-mingw32 >> profiles/categories
# linke zu folgenden ebuilds in portage für die eben erstellte Kategorie
for i in w32api mingw-runtime
do ln -s ${GENTOOREP}/dev-util/$i cross-i686-pc-mingw32/$i
done
for i in gcc gdb binutils
do ln -s ${GENTOOREP}/sys-devel/$i cross-i686-pc-mingw32/$i
done
# setze Optionen für die minimale toolchain
echo "CROSSCOMPILE_OPTS: cross-i686-pc-mingw32/* headers-only" >> /etc/paludis/use.conf
echo "cross-i686-pc-mingw32/gcc -* nocxx" >> /etc/paludis/use.conf
# header
paludis -i cross-i686-pc-mingw32/{w32api,mingw-runtime}
# minimaler gcc
paludis -i cross-i686-pc-mingw32/{binutils,gcc}
# deaktiviere use flags für den vollen gcc, die nicht gebraucht werden
sed -i -e 's/^cross-i686-pc-mingw32\/gcc.*/cross-i686-pc-mingw32\/gcc -nls -gcj -gtk/' \
/etc/paludis/use.conf
sed -i -e 's/^CROSSCOMPILE_OPTS/#\0/' /etc/paludis/use.conf
# komplette toolchain
paludis -i cross-i686-pc-mingw32/{w32api,mingw-runtime,gcc,gdb}
--Cmuelle8 22:36, 9. Jul. 2008 (UTC)
[Bearbeiten] Installation der SDL
Nachdem die Toolchain installiert ist, muss die SDL zur Umgebung hinzugefügt werden. Es werden die MinGW32 Development Libraries benötigt. Downloade die aktuelle Version. Dann müssen mindestens die Verzeichnisse bin, include, lib und share nach /usr/i686-mingw32/usr/ entpackt werden. Achte darauf, das die entpackten Dateien die richtigen Rechte besitzen. Wenn Du Fehlermeldungen erhältst wie
libSDL.la is not a proper libtool archive
liegt es wahrscheinlich an falsch gesetzten Rechten.
Ich vermute es existiert ein Weg, die SDL mit xmerge, crossdev, oder so zu installieren, mir ist es aber nicht gelungen...
[Bearbeiten] KDevelop einrichten
Es wird angenommen, das KDevelop bereits installiert, und außerdem ein kleines SDL-Projekt(z.B. das "Simple SDL Project" aus den KDevelop templates) vorhanden ist. Nun klicke auf "Project", dann "Project Options" und danach "Configure Options". Im oberen Teil des Fensters ist ein Eingabefeld "Configuration". Dort tippst du "Win32" ein und klickst rechts daneben auf "add"(Jeder andere Name um deine Projekt-Konfigurationen auseinander zu halten ist auch möglich z.B. "mingw"). Im "General"-Tab sollte stehen:
Configure arguments
--target=i686-mingw32 --host=i686-mingw32 --build=i686-linux --with-sdl-config=/usr/i686-mingw32/usr/bin/sdl-config
Build directory
Win32
"Top source directory" und "C/C++ preprocessor flags(CPPFLAGS)" sollte leer sein, außer dein Projekt ist auf entsprechende Konfiguration angewiesen.
Linker flags(LDFLAGS)
-L/usr/i686-mingw32/usr/lib -mwindows
Dann müssen noch einige Umgebungsvariablen hinzugefügt werden:
LD with the value: i686-mingw32-ld LIBSDL_CONFIG with the value: /usr/i686-mingw32/usr/bin/sdl-config PATH with the value: /usr/i686-mingw32/usr/bin:/usr/i686-mingw32/usr:$PATH prefix with the value /usr/i686-mingw32
Wenn du fertig bist sollte der Dialog etwa so aussehen:
Im "C"-Tab muss "Compiler-command(CC)" auf "i686-mingw32-gcc" gesetzt werden.
Entsprechend muss im "C++"-Tab "Compiler-command(CXX)" auf "i686-mingw32-g++" gesetzt werden.
Drücke auf "OK" um deine Änderungen zu speichern und lass KDevelop noch "Autoconf & Friends" für das Win32 target ausführen. Wenn du eine Fehlermeldung über einen fehlgeschlagenen Gentoo sanity-check erhältst, musst Du
libtoolize --copy --force
im top-level-Verzeichnis deines Projekts ausführen.
Das war alles! Du kannst nun zwischen Linux-Targets und Win32-Targets einfach wechseln indem Du die entsprechende Konfiguration im "Project"->"Build Configuration" Dialog auswählst und danach F8 drückst um das Kompilieren zu starten. So sieht das dann etwa aus:
Die mit MinGW erzeugten Dateien brauchen keine zusätzlichen DLLs(kein cygwin.dll oder ähnliches) und sind ohne weiteres unter Windows (ich glaub' ab Win98) lauffähig. Da in diesem HowTo die SDL verwendet wird muss natürlich die SDL.dll auf dem Windows-System vorhanden sein.
[Bearbeiten] OpenGL Unterstützung hinzufügen
Versucht man jetzt ein Projekt zu kompilieren, das OpenGL verwendet, wird sich der Compiler/Linker etwa folgendermaßen beschweren:
/usr/libexec/gcc/i686-mingw32/ld: cannot find -lGL collect2: ld returned 1 exit status
Dieser Fehler kommt daher, das die OpenGL Bibliotheken in Windows andere Namen besitzen. Nämlich: libGL ist libopengl32 und libGLU ist libglu32. Wenn man keine Namens-Kollisionen befürchtet, scheint es das einfachste zu sein, Symlinks zu erzeugen, da KDevelop noch keine (nie?) Unterstützung hat unterschiedliche Bibliotheken mit unterschiedlichen Konfigurationszielen zu verknüpfen.
Also macht man folgendes:
ln -s /usr/i686-mingw32/usr/lib/libopengl32.a /usr/i686-mingw32/usr/lib/libGL.a ln -s /usr/i686-mingw32/usr/lib/libglu32.a /usr/i686-mingw32/usr/lib/libGLU.a
[Bearbeiten] Sonstiges
Wenn man auf Autotools basierende Projekte mit seiner neuen Toolchain kompilieren möchte, sollte man einen Blick auf cross-configure und cross-make werfen.
[Bearbeiten] Referenzen
[1] The Gentoo MingW HowTo
[2] Cross-Compiling for Windows with KDevelop and MingW
[3] SDL-Documentation regarding cross-compiling
[4] SDL-FAQ
[5] Gentoo Cross-Development Guide


