Die offizielle FreeBASIC-Ausgabe enthält als Compiler den fbc, FreeBASICs Flagschiff. Der fbc ist ein Befehlszeilen-Compiler und kann von der Befehlszeile gestartet werden - von DOS, dem Windows-Befehlszeilenprompt oder einer linux-Shell. IDE-verwöhnte Benutzer können sich eine IDE (z.B. FBEdit, FBIDE, Geany [in alphabetischer Reihenfolge..]) selbst installieren, um nicht mit der Befehlszeile hantieren zu müssen. Der Aufruf von fbc von der Konsole ohne irgendein Argument, liefert eine Liste der vorhandenen Optionen/Befehlszeilen-Schalter, die benutzt werden können, um das Verhalten des Compilers genau einzustellen.
(Im weiteren Teil dienen Anführungszeichen zur Kennzeichnung hier im Text, sie sind nicht für die Optionen erforderlich)
Im einfachsten Fall nimmt fbc eine Quelldatei als Befehlszeilen-Argument und erstellt eine ausführbare Datei. Das erfolgt durch kompilieren der Quelldatei (.bas) in eine Assembler-Datei (.asm), die erst per GAS in eine Objekt-Datei (.o) übersetzt wird und dann vom Linker LD mit anderen Objekt-Dateien und Libraries (diese Programmbibliotheken werden im Allgemeinen und im Folgenden unter linux und Windows "Libraries" genannt), die für den Ablauf erforderlich sind, letztendlich zur ausführbaren Datei gemacht wird. Die Assembler- und kompilierten Objekt-Dateien werden dann normalerweise gelöscht. Zum Beispiel erstellt der folgende Befehl:
fbc foo.bas
die ausführbare Datei foo.exe unter DOS/Windows und ./foo bei linux. Der fbc übernimmt mehrere Quelldateien auf einmal, kompiliert und linkt sie alle in eine ausführbare Datei. Beispielsweise erzeugt der nächste Befehl:
fbc foo.bas bar.bas baz.bas
die Exe-Datei foo.exe unter DOS/Windows und ./foo bei linux. Da foo.bas zuerst in der Liste steht, wird es der Haupteintrittspunkt der Exe-Datei sein und auch den Namen dafür liefern. Um einen anderen Eintrittspunkt zu bestimmen, werden die Schalter "-m" und "-x" benutzt, jenachdem. Soll also, z.B., baz.bas der Haupteintrittspunkt der Exe-Datei foobar.exe sein, würde der Aufruf:
fbc -x foobar.exe -m baz foo.bas bar.bas baz.bas
benutzt werden
Der "-x" Schalter benennt genau die ausführbare Datei, also würde auch unter linux aus dem obigen Befehl die ausführbare Datei ./foobar.exe erstellt werden.
Syntax:
fbc [ Optionen ] [Eingabe_liste ]
Wobei Eingabe_liste eine Liste von Dateinamen ist. Der Compiler entscheidet abhängig von der Erweiterung, wie eine Datei behandelt werden soll. Akzeptiert werden folgende Dateitypen:
Dateierweiterung | Beschreibung |
---|---|
.bas | FreeBASIC Quelldatei zu kompilierende Programmdatei |
.a | Bibliothek(Library), statische Sammlung von vorkompilierten SUBs/FUNCTIONs |
.o | Objektdatei (Einzelnes vorkompiliertes Modul) |
.rc | Ressourcen Script (nur Windows), Ressourcen-Beschreibung (Dialoge, Menüs, Icons, Tastaturkürzel) |
.res | Kompilierte Ressourcendatei (nur Windows) |
.xpm | X icon pixmap (nur linux) |
Die folgenden Parameter können an den FreeBASIC Compiler übergeben werden:
Erzeugung von Bibliotheken mit privaten/öffentlichen SUBs / FUNCTIONs
-export [Name] | Exportiert Symbole für dynamisches Linken. Siehe EXPORT. Der Name einer SUB/FUNCTION wird explizit für andere Module zugänglich gemacht. Ein anderes Modul kann mit Hilfe der DECLARE SUB/FUNCTION Anweisung solche öffentlich deklarierten SUBs / FUNCTIONs benutzen. |
-dll, -dylib | Erzeugt eine dynamische Link-Library. So wird eine DLL unter Windows (inklusive der Import-Library(.a) erstellt) oder eine .so unter linux. Erzeugt eine Sammlung von kompilierten öffentlichen SUBs / FUNCTIONs, die zum Programmstart automatisch dem Programm an festen Adressen hinzugefügt werden. Auf diese Weise erzeugte Module müssen dem fertigen Programm separat mitgegeben werden. Die Dateien haben unter Windows die Endung (*.dll) und unter linux (*.so). Es werden ebenfalls separate vorkompilierte Module erzeugt, die aber erst während des Programmlaufes an nicht festen Adressen dynamisch hinzugefügt werden, also nicht wie bei der Option -dll schon bereits zum Programmstart. Dieses wird dynamisches Linken genannt. Auch diese Module müssen dem Programm separat mitgegeben werden. |
-lib | Erzeugt eine statische Library Es wird eine Sammlung von SUBs / FUNCTIONs vorkompiliert, die aber nicht wie bei den Optionen -dll und -dylib einem Programm separat mitgegeben, sondern direkt in das fertige Programm eingefügt wird. Dies nennt man daher statisches Linken. |
[-a] [Name] | Name als .o/.a Eingabedatei behandeln. Das "-a" ist optional, wenn die vorkompilierte Objektdatei ohne feste Adressen Endung *.o hat, sie wird dann der zu erzeugenden Datei hinzugefügt. |
-c | Nur kompilieren (eine Objektdatei erzeugen), nicht linken Es werden Sammlungen von SUBs / FUNCTIONs vorkompiliert, aber nicht zu einem ausführbaren Programm verbunden. Werden mehrere Dateien gleichzeitig oder hintereinander kompiliert, so muss die Hauptdatei mit "-m" markiert werden. |
-C | Während des Kompilierens werden Objektdateien mit der Endung (*.o) erzeugt und am Ende wieder gelöscht. Mit der Option -C werden die Objektdateien nicht gelöscht.(Seit FBC 0.20) |
-l [Name] | Fügt eine Library-Datei zur Linker-Liste hinzu. Eine fertige vorkompilierte statische Sammlung von SUBs/FUNCTIONs, den sogenannten Librarys mit dem Namen lib [Name].a wird statisch dem Programm hinzugefügt. Die ausführbare Programmdatei und das Mitgeben von Dll's (*.dll) oder Shared-Librarys (*.so) kann entfallen. |
Behandlung von Programmdateien (*.bas und *.bi)
[-b] [Name] | Fügt eine Quelldatei zur Kompilierung hinzu. Das "-b" ist optional. Im Allgemeinen ist diese Option nicht nötig, kann aber benutzt werden, wenn die hinzuzufügende Datei kein .Bas-Erweiterung hat oder aus einem anderen Verzeichnis stammt |
-i [Name] | Fügt einen Suchpfad für include-Dateien(*.bi) hinzu. Werden "-i" Schalter mehrfach verwendet, bestimmt die Reihenfolge ihres Auftretens die Reihenfolge, in der die Verzeichnisse durchsucht werden. |
-include [Name] | Gibt eine Datei an, die #include't wird, bevor die Quelldateien übersetzt werden. Werden -include Schalter mehrfach verwendet, bestimmt die Reihenfolge ihres Auftretens die Reihenfolge, in der die Dateien #include't werden. Bewirkt, dass die mit 'Name' angegebenen Dateien an den Anfang des Hauptmoduls eingefügt werden, als wäre dort eine entsprechende INCLUDE-Anweisung. |
-g [Name] | Ermöglicht Funktions-Profiling. Nach der Ausführung einer Exe-Datei, die mit dieser Option kompiliert wurde, wird eine Datei gmon.out im Programmverzeichnis erstellt. Damit kann dann mittels GPROF eine Analyse der Programmausführung erfolgen.(bis ~0.13.*, s. -profile) |
-forcelang [Parameter] | Diese Option überschreibt #Lang | '$Lang-Anweisungen aus dem Quelltext. Mögliche Parameter:fb (Standard), fblite, qb oder deprecated |
-lang [fb|fblite|qb|deprecated] | Um alte GW-BASIC- oder QuickBasick-/QBasic-Quellcodes ohne größere Änderungen zu kompilieren, kann auf der Befehlszeile die '-lang qb' Option benutzt werden. Sie bietet eine verbesserte Kompatibilität zu QuickBasic/QBasic-Code. Um FreeBASIC 0.16b oder noch ältere Quellcodes zu kompilieren, kann die Option '-lang deprecated' benutzt werden. Sie wurde aus Kompatibilitätsgründen beibehalten aber nicht weiterentwickelt. |
-[m|entry] [Quelldatei] | Bestimmt den Haupteintrittspunkt einer Quelldatei; das Argument ist der Name einer Quelldatei ohne ihre Erweiterung. Werden "-m" oder "-entry" nicht verwendet, ist die erste angegebene Quelldatei der Haupteintrittspunkt. Wird der "-c" oder "-r" Schalter verwendet, müssen "-m" oder "-entry" angegeben werden, wenn eine Hauptquelldatei kompiliert wird. Die Datei [Quelldatei] wird als Startdatei angenommen. Sie enthält den Programmstart Main. Als Standard wird ohne diese Option die erste angegebene .Bas-Datei als Startdatei angesehen. |
-o [Name] | Setzt den Namen der Ausgabedatei der kompilierten Quelldatei oder Objektdatei (.o). Der "-o" Schalter muß unmittelbar nach der Quelldatei stehen, die mit dem "-b" Schalter angegeben wurde. Der Schalter wirkt allerdings nur zusammen mit dem "-c" Schalter, da Objektdateien normalerweise nicht gespeichert werden. Wird der "-o" Schalter für eine übergebene Datei nicht benutzt, erhält die Ausgabedatei denselben Namen, wie die Quelldatei nur mit einer ".o" Erweiterung. Unabhängig vom Namen der Programmdateien mit der Endung (*.bas) wird ein Programm mit dem [Namen] bzw. [Namen.exe] erzeugt. |
Bedingtes Kompilieren und Präprozessor
-d [Name=Wert] | Fügt ein Präprozessor-Makro allen Quelldateien hinzu. Ist dasselbe, wie die Verwendung der Präprozessordirektiven #define oder #macro. Für bedingtes Kompilieren kann man einen Wert definieren z.B. DEBUG=1, der dann mit #IF oder #IFDEF, #IFNDEF abgefragt werden kann. |
-pp | Nur die vorkompilierte('preprocessed') Quelldatei wird ausgegeben; keine komplette Kompilierung! |
Fehlerbehandlung
-e | Einfache Fehlerunterstützung einschalten. Es werden Fehlererkennungs-Funktionen in das fertige Programm eingefügt, die zum Programmabbruch führen können, wenn ein schwerer Fehler auftrat. |
-ex | Erweiterte Fehlerunterstützung einschalten, wie die Option -e aber mit der Möglichkeit, eigene Fehlerbehandlung zu implementieren. Mit Hilfe der RESUME-Anweisung kann das Programm auf einen Fehler reagieren und es muss nicht zwangsläufig beendet werden. |
-exx | Wie -e und -ex, aber mit zusätzlicher Prüfung auf gültige Array-Grenzen und korrekte Verwendung von Zeigeradressen(Nullpointer-Prüfung). |
-g | In die Ausgabedateien werden Debugger-Symbole eingefügt, die dann von GDB-kompatiblen Debuggern verwendet werden können. Informationen zur Fehlersuche werden in das Programm integriert. Aufgrund der zusätzlichen Informationen ist es möglich, zur Laufzeit das Programmm Schritt für Schritt auf seine Funktionsweise hin zu überprüfen. Das schrittweise Ausführen von Programmen wird mit Hilfe von Debuggerprogrammen realisiert, FreeBASIC liegt der GNU Debuger gdb bzw. gdb.exe bei. Es gibt aber auch frei erhältliche grafische Oberflächen, die das Debuggen erheblich vereinfachen und die Debug-Information visuell aufbereiten. |
-noerrline | Eine fehlerhafte Stelle im Quellcode nicht anzeigen; nützlich, wenn eine IDE die Fehlermeldungen auswertet. |
Programmerstellung
-arch [Typ] | Setzt den Ziel-CPU-Typ (Standard:486 falls nicht angegeben, kann 386,486,586,686,athlon,athlon-xp,athlon-fx,k8-sse3,pentium-mmx,pentium2,pentium3,pentium4,pentium4-sse3 oder native sein) |
-fpu [X87|SSE] | Wird die Option nicht oder -fpu X87 angegeben, benutzt FBC die normalen 387-Assembleranweisungen für mathematische Operationen. Bei der Option -fpu SSE werden SSE2-Assembleranweisungen zur Berechnungen von Single und Double - Variablen benutzt (Es wird vorher geprüft, ob der Prozessor fähig ist, SSE2 Anweisungen auszuführen. Wenn nicht wird die Option ignoriert. (Seit FBC 0.20)) |
-fpmode [FAST | PRECISE] | Nur in Verbindung mit der Option -fpu SSE wirksam.(Seit FBC 0.21) |
-gen [gas | gcc] | FBC übersetzt den Quelltext für x86 GAS-Assembler (gas)oder in C für GNU C (gcc).(Seit FBC 0.21) |
-r | Nur Assemblerdateien mit der Endung (*.asm) erzeugen, nicht kompilieren.(Seit FBC 0.20). Seit FBC 0.21 und unter Verwendung von -gen gcc werden Dateien mit der Endung (*.c) erstellt. Werden mehrere Dateien gleichzeitig oder hintereinander kompiliert, so muss die Hauptdatei mit "-m" markiert werden. |
-R | Während des Kompilierens werden Assemblerdateien mit der Endung (*.asm) erzeugt und am Ende wieder gelöscht. Mit der Option -R [Retain=behalten] werden die Assemblerdateien nicht gelöscht und können mit einem Editor eingesehen werden. Dies kann unter anderem dann nützlich sein, wenn man mit der Option -g Debug-Informationen erzeugt und sehen will, welche Programmanweisungen der Präprozessor generiert hat. Diese werden in den Assembler-Kommentaren abgelegt.Präprozessor-Makros in diesen Dateien werden ausgewertet.(Änderung ab FBC 0.20). Seit FBC 0.21 und unter Verwendung von -gen gcc werden Dateien mit der Endung (*.c) erstellt. |
-s [gui|console] | (Nur Windows)Gibt an, ob ein Programm im Fenster oder in der Konsole ausgeführt werden soll. Erlaubt sind gui und console (standardmäßig wird console benutzt). Wird als Subsystem gui angegeben, erscheint kein Konsolenfenster hinter dem Programmfenster. |
-t [Wert] | (Windows/DOS)Gibt die Größe des verwendeten Stackspeichers in KByte (1024 Byte-Einheiten) an(Standard: 1024 KBytes). Lokale Arrays werden auf dem Stack erzeugt, deshalb ist 1MB möglicherweise nicht immer genug(z.B. für Stack von 8MB: -t 8192).Ausnahmen können auch umfangreiche Programme sein, die reichlich Gebrauch von rekursiven Funktionsaufrufen machen, wie z.B. Raytracer oder Fraktalgenerator. |
-target [Name] | (Nur Windows)Name kann "dos"|"linux"|"win32"|"xbox"|"cygwin" sein. Kann bei der Windows-Version des Compilers benutzt werden, um ausführbare Dateien für DOS32, linux
oder Xbox zu erstellen. Die bin und lib Verzeichnisse müssen die /dos, /linux oder /xbox Unterverzeichnisse der entsprechenden Distribution haben. Mit [Name] wird das Zielbetriebssystem angegeben, für das ein Programm erzeugt werden soll. Diese Option steht nur unter Windows zur Verfügung und als [Name] sind daher dos, linux, und xbox erlaubt. (Um auf Windows für andere Betriebssysteme kompilieren zu können, müssen weitere Voraussetzungen erfüllt sein.)(Ab FB 0.22.0 nur noch cygwin und dos erlaubt) |
-titel [ Name ] | Setze XBE-Anzeigetitel(xbox) |
-mt | Erzwinge Linken mit 'Thread-sicherer' Laufzeit-Library für Applikationen mit mehreren Threads. Normalerweise wird automatisch immer die 'Thread-sichere' Version benutzt, wenn die eingebauten FreeBASIC 'threading'-Funktionen verwendet werden. Deshalb kommt diese Option nur bei eigenen 'Thread'-Routinen zum Einsatz. |
-nodeflibs | Keine der Standard-Libraries beim Linken einbinden Bindet Standard-Bibliotheken nicht ein; alle Lib's müssen manuell mit INCLIB geladen werden, und die Prozeduren darin mit DECLARE deklariert werden. |
-O [ Wert ] | Setzt die Optimierungsebene(Standard ist 0); kann sein 0, 1, 2, 3 oder max (=3) |
-p [ Librarypfad ] | Füge einen Pfad zum Suchen von Libraries hinzu. Standardmäßig werden Libraries im FreeBASIC-Systemlibraries- Verzeichnis und im aktuellen Verzeichnis gesucht. |
-vec [ Wert ] | Setzt die automatische Vektorisierungsebene (Standard ist 0), mögliche Werte [0 | NONE] | 1 | 2.(Verfügbar seit FB 0.21.0) |
-Wa [ Optionen ] | Übergabe von Optionen an den Assembler GAS, Optionen müssen durch Komma[ta|s] getrennt werden. |
-Wc [ Optionen ] | Übergabe von Optionen an GCC bei Verwendung von -gen gcc; Optionen müssen durch Komma[ta|s] getrennt werden. |
-Wl [ Optionen ] | Übergabe von Optionen an den Linker LD, Optionen müssen durch Komma[ta|s] getrennt werden. |
-x [Name] | Setzt den Namen der Exe-Datei/Library, mit Erweiterung. Standardmäßig der Name der ersten Quell-Datei, die auf der Befehlszeile übergeben wurde. Beim Kompilieren von Libraries, muß die Datei den "lib"-Prefix im Namen haben, sonst kann der Linker sie vielleicht nicht finden. Beim getrennten Kompilieren und Linken, darf diese Option NUR VOM Linker gesetzt werden.Legt demnach den Namen der Enddatei fest, also den der EXE, LIB oder DLL. |
-z gosub-setjmp | Benutze setjmp/longjmp zum Implementieren von GOSUB |
Informationen
-v | Aktiviert den ausführlichen Modus; der Compiler zeigt dann seine Aktionen Schritt für Schritt an. |
-version | Zeigt Programmversion des verwendeten Compilers an. |
-w [Wert] | -w ["0"|"1"|"all"|"pedantic"] Setzt die Mindest-Warnebene: "-w 0" zeigt alle Compiler-Warnungen(Standard), während "-w 1" sie versteckt. |
-prefix [Pfad] | Setzt den Compiler-Pefix (wo der Compiler die bin-, lib- und inc-Verzeichnisse sucht); standardmäßig ist das der Pfad, in dem sich fbc befindet, falls das bestimmt werden kann. |
-profile | Der Compiler erstellt nach Beendigung die Datei profile.txt, die alle Timing-Ergebnisse für Funktionsaufrufe enthält. Diese Technik nennt man auch Profiling. |
-maxerr [Anzahl|"inf"] | Setzt die Anzahl der Fehler, die der Compiler finden darf, bevor der Vorgang abgebrochen wird; Standard ist 10. Wenn "inf"(unendlich) angegeben wird, macht der Compiler weiter bis zum Ende der Quelldatei; nützlich, wenn eine IDE die Fehlermeldungen auswertet. |
-map [Name] | Link-Map als Datei [Name] speichern |
Voreinstellungen aus Dateien einlesen
@Dateiname | Häufig benutzte Compiler-Optionen lassen sich als Text-Datei Dateiname abspeichern und können unter Angabe von @Dateiname zum Kompilieren benutzt werden.(Verfügbar seit FB 0.21.0) |
Beispiele:
fbc meinprog.bas
(Mit der DOS-Version von fbc: Kompilieren und linken einer ausführbaren DOS-Datei MEINPROG.EXE
fbc -s gui meinprog.bas
(Mit der Windows-Version von fbc: Kompilieren und linken einer ausführbaren Windows-Datei meinprog.exe. Bei diesem Program wird das Konsolenfenster nicht angezeigt ("MS-DOS Prompt"))
fbc -lib modul1.bas modul2.bas modul.bas -x libmeinelib.a
(Kompilieren und linken einer statischen Bibliothek libmeinelib.a aus den drei Quelldateien)
fbc -m haupt_modul -c haupt_modul.bas
(Kompilieren einer Objekt-Datei haupt_modul.o und markieren als Eintrittspunkt)
fbc -c unter_modul.bas
(Kompilieren einer Objekt-Datei unter_modul.o)
fbc -x anwendung.exe haupt_modul.o unter_modul.o
(Linken einer ausführbaren anwendung.exe)
Anmerkungen:
Bei Komplett-Downloads(die nicht vom fb-portal angeboten werden), also Compiler & IDE sollte nach der Installation zuerst geprüft werden, ob auch wirklich der aktuelle Compiler enthalten ist(s.o. fbc -version), sonst kann es böse Überraschungen geben, wenn eine alte Compiler-Version enthalten sein sollte..
Es gibt auch noch die Compiler-Option -z [Wert], diese setzt verschiedene Compiler-Einstellungen. Da es aber keine Garantie gibt, daß diese Option in späteren Versionen noch vorhanden ist, sollte sie mit Bedacht verwendet werden.
Unterschiede zu QB:
Erstellt 32-Bit Anwendungen anstelle von 16-Bit-Anwendungen oder nur interpretierten Programmen. Der Compiler ist für mehrere Plattformen verfügbar wie z.B. Linux, DOS und Windows. Auch auf der X-Box sind spezielle FB-Programme ausführbar. FreeBASIC ist 100% OpenSource und verwendet ausschließlich OpenSource-Software. Siehe auch http://fbc.sf.net ist die englischsprachige Entwicklerseite.
Wird immer noch weiterentwickelt und verbessert!^^