Sign in Join
Wiki copytemporary

Cross compiling/de

Deutsch · English · Español · Français · Magyar · Português · Русский · 中文(中国) · 中文(台灣)

Vorwort

Dies ist eine kurze Einführung für Neulinge. Die folgenden Abschnitte beschreiben, wie man ein System für cross compile einrichtet, das bedeutet, arbeiten unter Linux und erzeugen von Win32 executables (oder freebsd oder darwin, oder ...). FreePascal ist ein Compiler und konvertiert hauptsächlich Quellcode in binaries (Maschinensprache). Diese binaries enthalten auch Informationen darüber, wie das Betriebssystem das executable startet. Daher sind diese binaries Plattform-spezifisch. FreePascal selbst benötigt nicht viel Installation. Es kann binaries für viele Plattformen erzeugen. Der Compiler muss nur dazu angewiesen werden. Aber der Compiler ist nur ein Teil. Es gibt auch noch den Assembler und den Linker. Und diese Werkzeuge sind nicht in der Lage, cross code zu erzeugen. Daher müssen wir spezielle Linker 'ld' und Assembler 'as' für jede Zielplattform erzeugen. Dies sind die binutils. Nach Erstellung der cross tools, werden alle FPC Pascal Units cross compiled. Zum Beispiel, dann gibt es eine system.ppu Datei für jede Zielplattform. Dann wird ihre FPC Konfigurationsdatei eingerichtet, so dass cross compilation so einfach wird, dass sie alle langweiligen Details vergessen können. Das selbe wird für die LCL getan - die Lazarus Component Library. Und danach können sie Pascal Programme für Win32 cross kompilieren. Entweder starten sie sie mit Wine oder sie kopieren sie auf einen Windows Computer und testen sie dort.

Grundsätzliche Schritte

Es gibt einige übliche Schritte, die beteiligt sind in crosscompiling, die sie in jedem Fall tun müssen:

  1. Bereits einen FreePascal Compiler haben für die Plattform, von der sie kompilieren wollen.
  2. Sie müssen den FreePascal Quellcode haben.
  3. You need to either build from source or obtain binaries of the cross-binutils that run on the platform you are on and are designed to build programs for your desired target platform.
  4. Manchmal werden sie einige Dateien von der Zielplattform benötigen, zu der sie kompilieren.

Von Linux

Zu Linux

Zur Klarstellung: Dies ist für die Kompilierung von Linux(x86_64) zu Linux(i386).

Chances are that your 64 bit linux distrubution is already capable of compiling 32 bit programs but due to the way the fpc build process is designed there are a couple of things you might have to do.

text
 bash $ which i386-linux-ld
text
 bash $ which i386-linux-as

Wenn sie diese Dateien haben springen sie zum "Kompilieren" Abschnitt.

Ich hatte diese Dateien nicht und so erstellte ich ein paar Skripte:

text
#!/bin/bash
# name this file /usr/bin/i386-linux-ld
ld -A elf32-i386 $@
text
#!/bin/bash
# name this file /usr/bin/i386-linux-as
as --32 $@
text
bash $ chmod +x /usr/bin/i386-linux-as
bash $ chmod +x /usr/bin/i386-linux-ld
text
bash $ cd /usr/share/fpcsrc/<version>
bash $ make all CPU_TARGET=i386

dann:

text
bash $ su -c "make install CPU_TARGET=i386"

Das ist alles. Bearbeiten sie ihre /etc/fpc.cfg Datei falls erforderlich.

Zu Windows

Cross compiling for Windows under Linux

Wenn sie Version 2.1.1 oder höher des FPC Compilers verwenden können sie einfach tippen:

text
bash $ make all OS_TARGET=win32 CPU_TARGET=i386

und dann

text
bash $ su -c "make crossinstall OS_TARGET=win32 CPU_TARGET=i386"

Anmerkung: Um für Win64 zu erstellen lautet das make Kommando: make all OS_TARGET=win64 CPU_TARGET=x86_64

Der Grund für diese Einfachheit ist der in dieser Version von FPC enthaltene interne Linker.

Ein gutes Tutorial zum Thema ist im deutschen Lazarusforum zu finden.

Zu Darwin oder macOS

Vorbemerkung: der Autor des Orignaltexts warnt, einige Dinge vielleicht nicht ganz originalgetreu wiedergegeben zu haben, da er seine Erfahrungen erst zu späterem Zeitpunkt protokolliert hat. Bitte ergänzen/korrigieren Sie also diese Anleitung (möglichst auch den Originaltext) bei Bedarf!

text
$PATH=$PATH:$HOME/darwinroot/cross

Tippen Sie (unter Vorbehalt, siehe Vorbemerkung):

text
make all TARGET_OS=darwin TARGET_CPU=powerpc OPT="-Xd -Fl/$HOME/darwinroot/usr/lib"

wenn das Übersetzen damit erfolgreich war ist, installieren Sie es mit:

text
make install TARGET_OS=darwin TARGET_CPU=powerpc PREFIX=/cross/fpc

Zuletzt kopieren oder verlinken Sie die Datei ./compiler/ppccross irgendwohin, wo Sie sie leicht wieder aufrufen können, denn es ist Ihr neuer Compiler zum Übersetzen von PowerPC-Binaries.

text
#IFDEF powerpc
-Fu/cross/fpc/lib/fpc/$fpcversion/units/$fpctarget/
-Fu/cross/fpc/lib/fpc/$fpcversion/units/$fpctarget/rtl
-Fu/cross/fpc/lib/fpc/$fpcversion/units/$fpctarget/*
-k-systemroot $HOME/darwin/cross
#ENDIF

Weil Sie bei jeder Crosskompilierung sowohl ppccross als auch die oben beschriebenen Symlinks auf powerpc-darwin-* brauchen, sollten diese in Ihrem Suchpfad (PATH) zu finden sein. Dann genügt ein einfaches

text
ppccross someprogie.pas

und Sie erhalten das Binary für den PowerPC!

Von Windows

Zu Linux

Marco vd Voort schrieb einige crossnotes. Wenn jemand Zeit hat, dann kann er sie diesem Wiki hinzufügen.

Free Pascal 3.x

Mit fpc 3.x funktioniert die nachfolgend beschriebene Vorgehensweise. Es werden aktuelle binutils und die Quellen von Free Pascal benötigt. Lade also folgende Files herunter:

Binutils erstellen, am Beispiel von Fedora 20 x86_64:

Unter Windows lassen sich nun mit fpc die Quellen compilieren:

Von Darwin (macOS) i386

Von i386 zu PowerPC

Prüfen Sie zuerst, ob Sie bereits die Dateien powerpc-darwin-ld und powerpc-darwin-as besitzen:

text
 $ which powerpc-darwin-ld
 $ which powerpc-darwin-as

Wenn ja, überspringen Sie die Erzeugung der Symlinks und fahren Sie fort mit "FPC übersetzen".

Tatsächlich können Sie die "normalen" Binutils verwenden, weil sie "universal Binaries" sind. Aus diesem Grund reichen einfache Symlinks aus:

text
 $ sudo ln -s /usr/bin/as /usr/bin/powerpc-darwin-as
 $ sudo ln -s /usr/bin/ld /usr/bin/powerpc-darwin-ld

Die Symlinks können auch in jedem anderen Ordner abgelegt sein, so lange sich dieser in Ihrem $PATH befindet (z. B. /sw/bin, wenn man mittels fink installiert).

text
 $ cd fpc/compiler
 $ make cycle CPU_TARGET=powerpc

Das erzeugt den powerpc Compiler (fpc/compiler/ppcppc) und die Units der rtl.

Um powerpc Binaries zu erzeugen, braucht man keinen Cross-compiler. Powerpc fpc und ppcppc laufen mittels Rosetta problemlos auf IntelMacs.

Benötigt werden weitere Tests und Dokumentation für die parallele Installation beider Compiler und ihre Verwendung.

Fehlen Units, überprüfen Sie Ihre config Dateien $HOME/.fpc.cfg, /etc/fpc.cfg oder /sw/etc/fpc.cfg Je nachdem, wo Ihre Units abgespeichert sind, kann es sein, dass Sie folgendes ergänzen müssen:

text
-Fu/usr/local/lib/fpc/lib/fpc/$fpcversion/units/$fpctarget/
-Fu/usr/local/lib/fpc/lib/fpc/$fpcversion/units/$fpctarget/rtl
-Fu/usr/local/lib/fpc/lib/fpc/$fpcversion/units/$fpctarget/*

Erinnerung: Universal Binaries erzeugt man mittels lipo aus den individuellen (i386 und powerpc) Binaries.

Zu Windows, Linux und andere Plattformen

Der Paketmanager fink hat Pakete für das den 64-bit compiler fpc und Crosscompiler für Windows, Linux, FreeBSD mit mehreren CPUs.

Ein Beispiel für die Installation eines Crosscompilers ist:

text
$ fink install fpc-cross-i386-win32

oder

text
$ fink install fpc-cross-arm-linux

Programme übersetzt man dann mit diesen Kommandos:

text
 fpc -Pi386 -Twin32 FILENAME
 fpc -Parm -Tlinux FILENAME

Die derzeitige Liste an Crosscompiler mit fpc 3.0.4 ist:

bash
fpc-cross-arm-gba
fpc-cross-arm-linux
fpc-cross-arm-nds
fpc-cross-arm-wince
fpc-cross-arm-armv4t-embedded
fpc-cross-arm-armv7m-embedded
fpc-cross-i386-darwin
fpc-cross-i386-freebsd
fpc-cross-i386-go32v2
fpc-cross-i386-linux
fpc-cross-i386-nativent
fpc-cross-i386-netbsd
fpc-cross-i386-solaris
fpc-cross-i386-win32
fpc-cross-i386-wince
fpc-cross-jvm-android
fpc-cross-jvm-java
fpc-cross-m68k-linux
fpc-cross-mipsel-linux
fpc-cross-powerpc-linux
fpc-cross-sparc-linux
fpc-cross-x86-64-dragonfly
fpc-cross-x86-64-freebsd
fpc-cross-x86-64-linux
fpc-cross-x86-64-win64

Für andere Plattformen (Prozessoren und Systeme) muss man den Crosscompiler selbst erstellen. Das Schema ist immer das gleiche: Als erstes braucht man die entsprechenden binutils (Siehe Binutils) . Danach kann man den Crosscompiler und die Laufzeitbibliothek (run time library) erstellen. Mehr Details, wie man das erstellt, sind aus den Fink Paketbeschreibungen der obigen Crosscompiler ersichtlich.

Cross compile FAQ

Automatisches Tool (FPCUdeluxe)

Wen das zu kompliziert ist, kann folgendes Tool nehmen:

Es läuft auf allen gängigen Plattformen und erzeugt Cross-Compiler für die meisten gängigen Plattformen.

Warum cross compilieren?

Damit können sie ein Programm für ein anderes Betriebssystem/CPU entwickeln. Dieses kann per cross-compiling für ein anderes Betriebssystem oder eine andere CPU ohne Neustart oder Wechsel des Computers kompiliert werden.

Warum Linux zu Windows und nicht in der anderen Richtung?

Der Hauptgrund dafür ist, dass die Erzeugung von Unix binaries auf einer fremden Plattform (ein anderes Unix oder sogar Linux eingeschlossen) komplizierter ist. Statisches Linking ist bereits kompliziert, shared Linking noch um ein vielfaches schwieriger.

Sie würden die verwendeten Bibliotheken der Zielplattformen benötigen (gtk, glib,libc etc), und eine Menge zusätzlicher Konfiguration für ld. (library paths, dynlinker path, usw.)

Für statisches Linking wurde dies bereits teilweise erledigt. Es ist allerdings sehr kompliziert, da es die manuelle Nachbearbeitung der linker Dateien sowie der linker Befehlszeile erfordert. Ein tiefes Verständnis der Funktionsweise von Unix binaries ist dabei absolute Vorraussetzung.

Ich möchte mehr Informationen über die Erstellung von Freepascal. Wo kann ich diese finden?

Eine allgemeine FAQ (englischsprachig) im PDF-Format über die Erstellung und Konfiguration von FPC: http://www.stack.nl/~marcov/buildfaq.pdf.


From the Free Pascal wiki, page "Cross compiling/de", as it stood on 2021-07-19 after a change by Dbannon, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's Licensing page. If you have concerns about this material, message the admin.

Revision 2, last changed by WikiArchive .

Talk about this page

Nobody has opened a bench for this page yet. Sign in to open one.