PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Cross-Compiling mit Cygwin


Shink
2006-01-28, 10:44:00
Hallo!

Ich will eine Anwendung für ein Embedded System (x86-kompatible CPU, BusyBox-Linux) in C++ programmieren, mein Entwicklungssystem ist allerdings ein Windows-PC und BusyBox hat natürlich keinen GCC dabei.
Nun kann ich ja schon einmal das Zeug mit Cygwin compilieren; mit dem GCC von Cygwin kann man ja angeblich auch per Compilerflag Linux ELF-Binaries erzeugen.
Aber wie mache ich das genau und brauche ich dazu nicht noch die für Linux compilierten Libraries?

muhkuh_rs
2006-02-01, 16:59:15
Hallo!

Ich will eine Anwendung für ein Embedded System (x86-kompatible CPU, BusyBox-Linux) in C++ programmieren, mein Entwicklungssystem ist allerdings ein Windows-PC und BusyBox hat natürlich keinen GCC dabei.
Nun kann ich ja schon einmal das Zeug mit Cygwin compilieren; mit dem GCC von Cygwin kann man ja angeblich auch per Compilerflag Linux ELF-Binaries erzeugen.
Aber wie mache ich das genau und brauche ich dazu nicht noch die für Linux compilierten Libraries?

Was du willst funktioniert. Du musst in cygwin eine cross toolchain erstellen. Ich glaube dazu gehören binutils, gcc und glibc (oder z.B. uclibc). Wenn ich mich recht erinnere, dann musste man die selber unter cygwin neu bauen.

Von irgendwoher konnte man ein fertiges Script laden, dass die benötigten Sachen allein runtergeladen, konfiguriert und gebaut hat und mit irgendeiner Kombination von glibc, gcc und binutils hat es dann auch mal funktioniert und ich konnte ein "Hello World!" unter Windows übersetzen und unter Linux laufen lassen.

Im Endeffekt lohnt das einfach nicht die Mühe. Da hat man schneller ein Linux installiert, den Sourcecode rüberkopiert und dort übersetzt. Wenn man keine Lust darauf hat, die makefiles selber zu schreiben und automake zu kompliziert ist, dann kann ich CMake als cross plattform build tool empfehlen. Dummerweise gibt es für C++ unter Linux auch noch verschiedene ABIs, so dass man auch den gleichen Compiler (gcc 2.x, 3.x, 4.x) für die Anwendung nehmen muss, wie für die Klassenbibliotheken, die man auf dem Zielsystem linkt.

Bei der Entwicklung von Software für embeddedsysteme unter Linux habe ich gute Erfahrungen mit einer chroot-Umgebung. Dort kann man ein Entwicklungsystem mit auf das Zielsystem zugeschnittener Buildumgebung fahren.

Shink
2006-02-02, 08:32:01
Im Endeffekt lohnt das einfach nicht die Mühe. Da hat man schneller ein Linux installiert, den Sourcecode rüberkopiert und dort übersetzt. Wenn man keine Lust darauf hat, die makefiles selber zu schreiben und automake zu kompliziert ist, dann kann ich CMake als cross plattform build tool empfehlen. Dummerweise gibt es für C++ unter Linux auch noch verschiedene ABIs, so dass man auch den gleichen Compiler (gcc 2.x, 3.x, 4.x) für die Anwendung nehmen muss, wie für die Klassenbibliotheken, die man auf dem Zielsystem linkt.

Ja, genauso hab ichs dann auch gelöst. Allerdings werde ich wohl noch mehrere solcher Projekte haben, also würde es sich vermutlich schon auszahlen. Wär schön, wenn du das Skript noch finden würdest.

Und: Makefiles kann ich schreiben, muss ich aber nicht; macht Eclipse für mich. Damit kann man dann angeblich mittels gdb auch Cross-Debuggen, aber so weit bin ich noch nicht.


Bei der Entwicklung von Software für embeddedsysteme unter Linux habe ich gute Erfahrungen mit einer chroot-Umgebung. Dort kann man ein Entwicklungsystem mit auf das Zielsystem zugeschnittener Buildumgebung fahren.
chroot - Run a command with a different root directory
hm? Was genau soll das bringen?

Coda
2006-02-02, 10:21:11
Ein chroot ist eine seperate Dateisystemumgebung innerhalb des eigentlich Dateisystem. Also komplett mit /usr /lib, etc.

Du kannst mit chroot in sowas reinwechseln und hast praktisch ein anderes System (bis auf den Kernel).

muhkuh_rs
2006-02-02, 11:21:12
Ich glaube es war das. Allerdings lieft der Buildprozess wie gesagt nur bei einigen Kombinationen aus gcc und glibc durch.

http://www.kegel.com/crosstool/

Das mit der chroot-Umgebung hat Coda ja bereits kurz erklärt. Man erstellt sich in einem Verzeichnis ein neues Root Filesystem, was dann die erforderlichen libs, includes, binutils, gcc, glibc ... des Zielsystems enthält. Das ganze funktioniert natürlich nur so lange, wie der kernel des Hostsystems auch die erzeugten binaries des Zielsystems ausführen kann. Sonst ist man wieder am Cross-Compilieren aber da du meintest dass das Embeddedsystem x86 ist ...

Ich fand Gentoo dabei als Distribution sehr brauchbar. Da existieren schon fertige Buildumgebungen mit uclibc und für die Sourcepakete gibt es allerlei useflags für das Übersetzen, um bestimmte Abhängigkeiten zur Compilezeit zu entfernen (z.B. Alsa ohne SDL Support, X ohne OpenGL ...)