ANHANG B: Compiler-Optionen
Der Compiler fbc besitzt eine Vielzahl an Optionsschaltern, um das Verhalten den Wünschen nach anzupassen. Je nach verwendeter IDE können beim Compilieren die gewünschten Optionen mitgegeben werden. Wenn Sie fbc von der Konsole aus eufrufen, um die Datei meinProgramm.bas zu compilieren, lautet die Syntax
fbc meinProgramm.bas
(wobei vorausgesetzt wird, dass Sie sich im Ordner mit meinProgramm.bas befinden und dass der Ordner zu fbc bei den Systempfaden eingetragen ist1 — ansonsten sind zusätzlich die Pfadangaben erforderlich).
Die Dateiendung .bas ist zwingend erforderlich. fbc erkennt die zu compilierende Datei ausschließlich an dieser Endung. Erzeugt wird eine ausführbare Datei namens meinProgramm.exe (bzw. meinProgramm unter Linux).
B.1 Grundlegende Compileroptionen
Wenn Sie mehrere .bas-Dateien angeben, werden alle zusammen zu einem gemeinsamen Programm compiliert, dessen Name durch die erste angegebene .bas-Datei festgelegt wird. Auf diesem Weg können Sie Ihr Projekt auf mehrere Dateien aufteilen und nur Teile dieses Projektes im Compiliervorgang einbinden.
fbc meinProgramm.bas zusatz1.bas zusatz2.bas
erzeugt aus den drei Dateien ein Programm namens meinProgramm.exe (bzw. meinProgramm unter Linux).
Mit dem Schalter -x
lässt sich jedoch ein anderer Programmname wählen:
fbc -x neuesProgramm.exe meinProgramm.bas zusatz1.bas zusatz2.bas
Neben BASIC-Dateien können weitere Ressourcen eingebunden werden:
-
.a — Library (statische Sammlung vorcompilierter Prozeduren)
-
.o — Objektdatei (einzelnes vorcompiliertes Modul)
-
.rc — Ressourcendatei (Dialoge, Menüs, Icons, Tastaturkürzel; nur unter Windows)
-
.res — compilierte Ressourcendatei (nur unter Windows)
-
.xpm — Programmicon (nur unter Linux)
B.2 Dialekt wählen
fbc stellt verschiedene FreeBASIC-Dialekte zur Verfügung. Standardmäßig wird im Dialekt fb compiliert, dies kann jedoch auch explizit angegeben werden. Weitere Dialektformen sind qb für die beste Unterstützung alter QuickBASIC-Programme sowie fblite mit Unterstützung der FreeBASIC-Syntax, aber in einem QuickBASIC-ähnlichen Stil. Die letzte Dialektform lautet deprecated, womit Sprachkonstrukte unterstützt werden, die mit der Compiler-Version v0.17 aus dem FreeBASIC-Sprachschatz entfernt wurden. deprecated ist jedoch, wie der Name schon sagt, „missbilligt“ und kann möglicherweise in späteren Compiler-Versionen entfernt werden.
Die Dialektform kann mit dem Optionsschalter -lang
angegeben werden. Die Umstellung etwa auf fblite läuft über den Aufruf
fbc -lang fblite meinProgramm.bas
Wenn im Quellcode die Dialektform mittels #LANG
umgestellt wird, überschreibt dies die Wahl im Compileraufruf. Sie können die Wahl im Quelltext aber auch übergehen — dazu gibt es den Optionsschalter -forcelang
. Noch einmal kurz zusammengefasst: fbc verwendet als Dialektform die über -forcelang
eingestellte Option. Existiert diese nicht, wird die im Quelltext eingestellte Option verwendet. Existiert auch diese nicht, kommt -lang
zum Tragen. Wenn auch das nicht angegeben wurde, verwendet fbc die Voreinstellung -lang fb
.
B.3 Fehlerbehandlung einstellen
Das compilierte Programm soll nach Möglichkeit Laufzeitfehler ignorieren, da ein unkontrollierter Programmabbruch in der Regel nicht gewünscht ist. Nur in wirklich schwerwiegenden Fällen, etwa einem unerlaubten Speicherzugriff, wird das Programm abgebrochen. Dies kann jedoch dazu führen, dass Fehler schwer aufzufinden sind. fbc unterstützt professionelle Fehleranalyse über Debugger, bietet aber zugleich auch einfache Fehlerbehandlungen, mit denen bereits viele der typischen Probleme erkannt werden können.
Der Optionsschalter -e
schaltet die einfache Fehlerunterstützung ein. Dadurch werden in das fertige Programm Funktionen eingefügt, die beim Erkennen eines Fehlers zum Programmabbruch führen. Diese Fehler können dann auch mit ON ERROR
abgefangen werden.
Der Optionsschalter -ex
arbeitet wie "-e", jedoch mit der zusätzlichen Unterstützung von RESUME
, um das Programm nach einem aufgetretenen Fehler wieder fortzusetzen.
Der Optionsschalter -exx
arbeitet wie -e
und -ex
, aber mit zusätzlicher Prüfung auf gültige Array-Grenzen und korrekte Verwendung von Zeigeradressen (Nullpointer-Prüfung). Gerade während der ersten Gehversuche bei Arrays und Pointerzugriffen ist diese Funktion sehr empfehlenswert.
B.4 Unterdrüchung des Konsolenfensters
Wenn Sie unter Windows ein mit fbc erstelltes Programm starten, öffnet sich in aller Regel ein Konsolenfenster. Für Programme mit eigenem Grafikfenster ist das jedoch häufig störend. Um das Konsolenfenster zu unterdrücken, können Sie beim Compilieren die Option -s gui
angeben. Unter Linux hat der Schalter keine Bedeutung — dort wird bei einem Programmstart kein gesondertes Konsolenfenster geöffnet.
Achtung: Verwenden Sie -s gui
nur, wenn das Programm ein eigenes Grafikfenster verwendet oder automatisiert ohne Benutzereingabe abläuft (auch ohne das Warten auf einen Tastendruck am Ende des Programms). Sollte das Programm im Konsolenmodus auf eine Benutzereingabe warten, wird dies aufgrund des fehlenden Konsolenfenster zu einer Endlosschleife führen.
B.5 Weitere Optionsschalter
Es folgt eine Liste aller möglichen Optionsschalter. Die in diesem Kapitel bereits genannten werden ebenfalls noch einmal aufgeführt, sodass Sie hier eine komplette Zusammenstellung vorliegen haben.
B.5.1 Erzeugung von Bibliotheken (Libraries) mit privaten/öffentlichen Prozeduren
- -export <Name>
-
Exportiert Symbole für dynamisches Linken. Der Name einer Prozedur wird explizit für andere Module zugänglich gemacht. Ein anderes Modul kann mit Hilfe der Anweisung
DECLARE
solche öffentlich deklarierten Prozeduren benutzen. - -dll, -dylib
-
Erzeugt eine dynamische Link-Library. So wird unter Windows eine
*.dll
(inklusive der Import-Library*.dll.a
) bzw. unter Linux eine*.so
erstellt. - -lib
-
Erzeugt eine statische Library. Es wird eine Sammlung von Prozeduren vorcompiliert, 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>
-
Fügt eine vorcompilierte Objekt-Datei (
*.o
,*.a
) zur Linker-Liste hinzu. Das-a
ist optional, wenn die vorcompilierte Objektdatei die Endung*.o
oder*.a
besitzt. - -c
-
Compiliert nur (erzeugt eine Objektdatei), ohne zu linken. Es werden Sammlungen von Prozeduren vorcompiliert, aber nicht zu einem ausführbaren Programm verbunden. Werden mehrere Dateien gleichzeitig oder hintereinander compiliert, so muss die Hauptdatei mit "-m" markiert werden.
- -C
-
Behält Objektdateien bei. Während des Compilierens werden Objektdateien mit der Endung
*.o
erzeugt und am Ende wieder gelöscht. Mit der Option-C
werden die Objektdateien nicht gelöscht. - -l <Name>
-
Fügt eine Library-Datei zur Linker-Liste hinzu. Eine fertige vorcompilierte statische Sammlung von Prozeduren mit dem Namen
lib<Name>.a
wird statisch dem Programm hinzugefügt. Die ausführbare Programmdatei und das Mitgeben von DLLs oder Shared Librarys kann entfallen.
B.5.2 Behandlung von Programmdateien (*.bas und *.bi)
- [-b] <Name>
-
Fügt eine Quelldatei zur Compilierung hinzu. Das
-b
ist optional. Im Allgemeinen ist diese Option nicht nötig, kann aber benutzt werden, wenn die hinzuzufügende Datei nicht die Namenserweiterung .bas besitzt oder aus einem anderen Verzeichnis stammt. - -i <Name>
-
Fügt einen Suchpfad für include-Dateien (
*.bi
) hinzu. Wird die Option-i
mehrfach verwendet, bestimmt die Reihenfolge ihres Auftretens die Reihenfolge, in der die Verzeichnisse durchsucht werden. - -include <Name>
-
Gibt eine Datei an, die eingebunden wird, bevor die Quelldateien übersetzt werden. Wird die Option
-include
mehrfach verwendet, bestimmt die Reihenfolge ihres Auftretens die Reihenfolge, in der die Dateien eingebunden werden. Die Option bewirkt, dass die mit <Name> angegebenen Dateien an den Anfang des Hauptmoduls eingefügt werden, als wäre dort eine entsprechendeINCLUDE
-Anweisung. - -forcelang <fb | fblite | qb | deprecated>
-
Stellt die Dialektform ein, in der compiliert werden soll. Die Option überschreibt die Anweisung
#LANG
im Quelltext. - -lang <fb | fblite | qb | deprecated>
-
Stellt die Dialektform ein, in der compiliert werden soll. Diese wird von einem im Quelltext verwendeten
#LANG
überschrieben. - -[m | entry] <Quelldatei>
-
Bestimmt den Haupteintrittspunkt einer Quelldatei. Das Argument ist der Name einer Quelldatei ohne ihre Erweiterung. Die Datei <Quelldatei> wird als Startdatei angenommen. Sie enthält den Programmstart Main. Wird
-m
bzw.-entry
nicht verwendet, wird die erste angegebene Datei mit der Namenserweiterung*.bas
als Startdatei angesehen. Wird die Option-c
oder-r
verwendet, muss-m
bzw.-entry
angegeben werden, wenn eine Hauptquelldatei compiliert wird. - -o <Name>
-
Setzt den Namen der Ausgabedatei der compilierten Quelldatei oder Objektdatei (
.o
).-o
muss unmittelbar nach der Quelldatei stehen. Die Option wirkt allerdings nur zusammen mit der Option-c
, da Objektdateien normalerweise nicht gespeichert werden. Wird-o
für eine übergebene Datei nicht benutzt, erhält die Ausgabedatei denselben Namen wie die Quelldatei, nur mit der Dateierweiterung*.o
Unabhängig vom Namen der Programmdateien mit der Endung*.bas
wird ein Programm mit dem Namen./<Name>
bzw.<Name>.exe
erzeugt.
B.5.3 Bedingtes Compilieren und Präprozessor
- -d <Name=Wert>
-
Fügt ein Präprozessor-Makro allen Quelldateien hinzu. Die Option bewirkt dasselbe wie die Verwendung der Präprozessordirektiven
#DEFINE
oder#MACRO
. Für bedingtes Compilieren kann man einen Wert definieren, z. B.DEBUG=1
, der dann mit#IF
oder#IFDEF
bzw.#IFNDEF
abgefragt werden kann. - -pp
-
Nur die vorcompilierte Quelldatei ausgegeben; keine komplette Compilierung.
B.5.4 Fehlerbehandlung
- -e
-
Einfache Fehlerunterstützung einschalten. Es werden Funktionen zur Fehlererkennung in das fertige Programm eingefügt, die zum Programmabbruch führen können, wenn ein schwerer Fehler auftritt.
- -ex
-
Erweiterte Fehlerunterstützung einschalten. Die Option arbeitet wie
-e
, aber mit der Möglichkeit, eigene Fehlerbehandlung zu implementieren. Mit Hilfe der AnweisungRESUME
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
-
Debugger-Symbole in die Ausgabedateien einfügen, die 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 Programm 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.
B.5.5 Programmerstellung
- -arch <Typ>
-
Setzt den Ziel-CPU-Typ. Als <Typ> sind folgende Werte möglich:
32bit x86:386
,486
(Standard unter x86),586
,686
,athlon
,athlon-xp
,athlon-fx
,k8-sse3
,pentium-mmx
,pentium2
,pentium3
,pentium4
,pentium4-sse3
,native
64bit x86_64:x86_64
,x86-64
,amd64
32bit ARM:armv6
,armv7-a
(Standard unter ARM)
64bit ARM (AArch64):aarch64
weitere:native
(um für die Architektur zu compilieren, auf der der Compiler läuft),32
,64
(für schnelles Cross-Compiling nach 32 Bit bzw. 64 Bit auf der Standardplattform)
-arch
beeinflusst nur den neu generierten Code, nicht vorcompilierten Code wie die FreeBASIC Runtime-Library oder andere Libraries aus dem Ordnerlib
. Für ein erfolgreiches Cross-Compiling sind noch die zur Zielarchitektur passenden Libraries nötig. - -asm <att | intel>
-
Setzt das verwendete ASM-Format (betrifft nur
-gen gcc
) - -fpu <X87 | SSE>
-
Wird die Option ausgelassen 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 Gleitkommavariablen benutzt. Es wird zuvor geprüft, ob der Prozessor fähig ist, SSE2 Anweisungen auszuführen. Wenn nicht wird die Option ignoriert. - -fpmode <FAST | PRECISE>
-
Gibt die Genauigkeit von Berechnungen mit Nachkommazahlen an. Die Option ist nur in Verbindung mit
-fpu SSE
wirksam. - -gen <gas | gcc | llvm>
-
fbc übersetzt den Quelltext für x86-GAS-Assembler (gas), in C für GNU C (gcc) oder für die Low Level Virtual Machine (llvm).
- -r
-
Nur Assemblerdateien mit der Endung *.asm erzeugen, nicht compilieren.
- -R
-
Während des Compilierens werden Assemblerdateien mit der Endung *.asm erzeugt und am Ende wieder gelöscht. Mit der Option
-R
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. - -RR
-
Erhalte die endgültige .ASM-Datei
- -s <gui | console>
-
Nur Windows: Gibt an, ob ein Programm im Fenster oder in der Konsole ausgeführt werden soll. Standardmäßig wird
-s console
benutzt. Wird-s gui
angegeben, erscheint beim Programmstart kein Konsolenfenster; bei Bedarf muss ein gfx-Grafikfenster initialisiert werden. - -t <Wert>
-
Nur Windows/DOS: Gibt die Größe des verwendeten Stackspeichers in KByte (1024 Byte-Einheiten) an (Standard: 1024 KBytes).
- -target <dos | cygwin>
-
Nur Windows: Erstellt ausführbare Dateien für andere Systeme. Die
bin
- undlib
-Verzeichnisse müssen die Unterverzeichnisse/dos
bzw./linux
der entsprechenden Distribution enthalten. Um die Option einzusetzen, um für andere Betriebssysteme zu compilieren, müssen weitere Voraussetzungen erfüllt sein. - -titel <Name>
-
Nur XBOX: Setzt den XBE-Anzeigetitel.
- -mt
-
Erzwingt das Linken mit Thread-sicherer Laufzeitbibliothek für Applikationen mit mehreren Threads. Da normalerweise immer automatisch die Thread-sichere Version der eingebauten FreeBASIC-Threading-Funktionen verwendet werden, kommt diese Option nur bei eigenen Thread-Routinen zum Einsatz.
- -nodeflibs
-
Bindet Standard-Libraries nicht ein; alle Libraries müssen manuell mit
#INCLIB
geladen und die Prozeduren darin mitDECLARE
deklariert werden. - -O <Wert>
-
Setzt die Optimierungsebene; kann einen der Werte
0
(Standard),1
,2
,3
odermax
(=3) annehmen. - -p <Librarypfad>
-
Fügt einen Pfad zum Suchen von Libraries hinzu. Standardmäßig werden Libraries im Verzeichnis der FreeBASIC-Systembibliotheken und im aktuellen Verzeichnis gesucht.
- -vec <Wert>
-
Setzt die automatische Vektorisierungsebene. Mögliche Werte sind
0
(Standard) bzw.NONE
,1
und2
. - -Wa <Optionen>
-
Übergabe von Optionen an den Assembler GAS bei der Verwendung von
-gen gas
oder-gen llvm
. Optionen müssen durch Kommata getrennt werden. - -Wc <Optionen>
-
Übergabe von Optionen an GCC bei Verwendung von
-gen gcc
oder-gen llvm
. Optionen müssen durch Kommata getrennt werden. - -Wl <Optionen>
-
Übergabe von Optionen an den Linker LD. Optionen müssen durch Kommata getrennt werden.
- -x <Name>
-
Setzt den Namen der EXE-Datei/Library einschließlich Erweiterung. Standardmäßig wird der Name der ersten Quell-Datei verwendet, die auf der Befehlszeile übergeben wurde. Beim Compilieren von Libraries muß die Datei das Präfix
lib
im Namen haben, sonst kann der Linker sie vielleicht nicht finden.
Beim getrennten Compilieren und Linken darf diese Option nur vom Linker gesetzt werden. Die Option legt demnach den Namen der Enddatei fest, also den der EXE, LIB oder DLL. - -z gosub-setjmp
-
Benutzt setjmp/longjmp zum Implementieren von
GOSUB
B.5.6 Informationen
- -v
-
Aktiviert den ausführlichen Modus. Der Compiler gibt dann das Zielsystem und die Architektur aus und zeigt seine Aktionen Schritt für Schritt an.
- -version
-
Zeigt die Programmversion des verwendeten Compilers an.
- -w <level | all | none | param | escape | pedantic | next | funcptr | constness>
-
Setzt die Mindest-Warnebene. Nur Warnungen, die mindestens das angegebene level besitzen, werden angezeigt. Mit Abgaben wie
param
odernext
können zusätzliche Warnungen angezeigt werden. - -prefix <Pfad>
-
Setzt das Compiler-Präfix (den Ort, 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.
- -print <fblibdir | host | target | x | sha-1>
-
Gibt verschiedene Informationen aus wie den Library-Pfad des Compilers, den Host- bzw. das Zielsystem, den Dateinamen des erzeugten Programms oder den sha-1-Code des Compiler-Quelltextes. Nur die letzte Angabe wird angezeigt.
- -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 bis zum Ende der Quelldatei weiter. Dies ist nützlich, wenn eine IDE die Fehlermeldungen auswertet. - -map <Name>
-
Link-Map als Datei
Name
speichern
Fußnoten:
1) Bei der Installation unter Linux passiert das automatisch. Unter Windows müssen Sie dazu den Pfad in der Systemumgebungsvariablen %PATH% eintragen. Sie finden unter Windows aber im FreeBASIC-Installationsordner auch ein Programm namens open-console.exe. Hierbei handelt es sich um eine Konsole mit eingetragenem fbc-Pfad.