HOWTO MinGW und SDL CrossCompiler

Aus Gentoo Linux Wiki

Wechseln zu: Navigation, Suche
Dieser Artikel ist Teil der HOWTO Sammlung.
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:

Image:Kdevelop-CaptainSifff.1.png


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:

Image:KDevelop-CaptainSifff.2.png

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

'Persönliche Werkzeuge