![]() |
| Home > FAQ on different themes > de-amiga-faq > |
German Amiga-FAQ (Haeufig gestellte Fragen) (Part 2 of 4) |
Section 2 of 2 - Prev - Next
if (id = AllocMem(sizeof (struct InfoData),
MEMF_PUBLIC | MEMF_CLEAR)) {
if (mp = CreatePort(NULL, 0)) {
sp->sp_Msg.mn_Node.ln_Name = (char *) &sp->sp_Pkt;
sp->sp_Pkt.dp_Link = &sp->sp_Msg;
sp->sp_Pkt.dp_Port = mp;
sp->sp_Pkt.dp_Type = ACTION_DISK_INFO;
sp->sp_Pkt.dp_Arg1 = MKBADDR(id);
PutMsg(cfh->fh_Type, &sp->sp_Msg);
(void) WaitPort(mp);
(void) GetMsg(mp);
if (sp->sp_Pkt.dp_Res1)
w = (struct Window *) id->id_VolumeNode;
DeletePort(mp);
}
FreeMem(id, sizeof (struct InfoData));
}
FreeMem(sp, sizeof (struct StandardPacket));
}
}
return w;
}
Anmerkungen:
* Auf ein CON-Fenster direkt zuzugreifen kann Konflikte mit Aktionen
des CON-Handlers hervorrufen. Seien Sie vorsichtig!
* Um den Window-Zeiger einer CLI-Konsole zu erhalten, übergibt man
ein durch Open("*", MODE_OLDFILE) gewonnenes FileHandle an obige
Funktion.
* Das Ergebnis der obigen Funktion kann sehr wohl NULL sein, etwa im
Falle eines AUX-Handlers oder falls ein AUTO-CON-Handler sein
Fenster nicht öffnen kann.
* Schickt man ein ACTION_DISK_INFO-Paket an einen AUTO-CON-Handler
(2.0+), so verliert dessen Fenster seine speziellen
AUTO-Eigenschaften (es kann also nicht mehr durch das Betätigen
des Close-Gadgets geschlossen werden), weil der in id_VolumeNode
gelieferte Window-Zeiger gültig bleiben muß.
* Alles in allem: Verwenden Sie diese Funktion nicht. :-)
Weitere Informationen finden Sie auf den Seiten 273, 276, 435, 463,
485 und 629 im "Amiga Guru Book" (siehe Dokumentation).
Ralph Babel, rbabel@babylon.pfm-mainz.de
4.10 Was sind Pragmas?
======================
Pragmas sind spezielle Anweisungen an den C-Compiler. Zwei Probleme
entstehen bei der Verwendung von Pragmas:
1. Pragmas sind hochgradig compilerspezifisch. Nicht einmal die
Amiga-Compiler haben dieselben Pragmas, selbst wenn damit das
gleiche bewirkt wird.
2. Man kann sich nicht darauf verlassen, daß ein Compiler Pragmas
ignoriert, die er nicht versteht. Dies gilt selbst dann, wenn man
einen Ausdruck wie den folgenden verwendet:
#ifndef MY_COMPILER
#pragma DoAnything
#endif
Das letztere Problem läßt sich umgehen, indem man Pragmas wie folgt
in eigene Include-Files setzt. (Das gleiche gilt übrigens auch für
Präprozessor-Kommandos wie #asm (Aztec-C) oder #extern (C++).)
#ifndef MY_COMPILER
#include
#endif
Aber was machen Pragmas auf dem Amiga? Meistens werden sie verwendet,
um dem Compiler mitzuteilen, wie gewisse Library-Funktionen aufgerufen
werden. (Tatsächlich wird fast immer diese Verwendung gemeint, wenn
Amiga-Besitzer über Pragmas sprechen.) Gewöhnliche C-Funktionen
erwarten ihre Argumente auf dem Stack, Library-Funktionen dagegen in
bestimmten Registern. Ferner erwarten sie den `Library-Base-Pointer' in
Register a6. Betrachten wir eine Pragma-Anweisung von Aztec-C:
#pragma amicall(SysBase,0xd2,FreeMem(a1,d0))
Dies weist den Compiler an, das erste Argument in Register a1 und das
zweite in d0 zu laden. Ferner wird der Inhalt der Variablen SysBase in
Register a6 geladen. Maxon-Pragmas sehen genauso aus, Dice- und
SAS-Pragmas sind allerdings etwas komplizierter:
#pragma libcall SysBase FreeMem d2 0902
Hier ist d2 (wie 0xd2 oben) der `Library-Vektor-Offset' (siehe
nächstes Beispiel). Die letzte Ziffer ist die Zahl der Argumente, die
davorstehende 0 ein Code für das Register mit dem Ergebnis und die
davor stehenden Ziffern sind Codes für die Register mit den Argumenten
in verkehrter Reihenfolge. (Die Codes bedeuten 0=d0, 1=d1, .., 8=a0,
9=a1, a=a2, ..)
Ein Kommando wie `FreeMem(fib,sizeof(*fib);' würde ein Compiler nun
in folgenden Code übersetzen:
move.l _fib,a1
move.l 260,d1 ; sizeof(struct FileInfoBlock)
move.l _SysBase,a6
jsr -0xd2(a6) ; 0xd2 = _LVOFreeMem
FreeMem in dieser Art aufzurufen ist kürzer und schneller als
zunächst die Argumente auf den Stack zu legen und dann eine Funktion
_FreeMem aufzurufen, die letzten Endes doch nur dasselbe tun und die
Argumente vom Stack in dieselben Register laden würde.
Das Portierungsproblem der Pragmas umgeht man, indem man sie
folgendermaßen in den eigenen Quelltext einbindet:
/* SAS/C, Dice und GNU-c (ab Version 2.6.1) machen es */
/* ganz einfach: */
#if defined(__SASC) || defined(_DCC) || defined(__GNUC__)
#include
#else
/* Lade den Funktionsprototyp. Dieser ist nicht vom */
/* verwendeten Compiler abhängig. */
#include
/* Pragmas sind vom Compiler abhängig, aber wenigstens */
/* die Namen der Dateien mit Pragmas sind relativ */
/* einheitlich. */
#ifdef AZTEC_C
#include
#elif defined(__MAXON__)
#include
#endif
/* Deklariere SysBase-Variable */
extern struct ExecBase *SysBase;
#endif
Das obige Beispiel kann problemlos mit allen angegebenen Compilern
verwendet werden und produziert optimalen Code. (Die proto/*.h-Files
machen übrigens auch nichts anderes als clib/*_protos.h und
pragmas/*_pragmas.h mit #include einzulesen und dann die
SysBase-Variable zu deklarieren.)
Eine abschließende Frage bleibt allerdings: Wie bekommt man die
Pragmas? Die meisten Compiler haben bereits fertige Pragmas im
Lieferumfang. Allerdings hilft das nicht, wenn man z.B. eine neue
Library benutzen möchte oder nur die Pragmas einer veralteten Version
hat. In diesem Fall kann man die Pragmas selbst aus den sogenannten
`FD'-Files erzeugen. Dazu haben die meisten Compiler ein Utility
namens `fd2pragma'. (Das NDU hat z.B. ein Directory namens FD, in dem
die FD-Files aller Libraries und Devices des OS enthalten sind. siehe
Include-Dateien) Es gibt auch ein frei kopierbares fd2pragma, das
Pragmas für Aztec, Dice, SAS und Maxon sowie LVO-Files für den
Aztec-Assembler und eventuelle Tag-Versionen produziert. (Aminet,
`dev/misc/fd2pragma2_0.lha' oder auf den Fish-CDs)
Für Pragmas unter dem gcc siehe Inline-Dateien.
4.11 Mein Compiler/Linker vermißt Symbole.
==========================================
Zunächst sollte man sich versichern, daß die Funktion tatsächlich
fehlt: Z.B. Floating-Point-Funktionen befinden sich in einer speziellen
Link-Library, die erst mit der Option `-lm' eingebunden wird. Ferner
kann es eine fehlende Variable sein: Wenn man z.B. ohne es zu bemerken
eine Intuition-Funktion benutzt, dann wird der Linker über das Fehlen
eines Symbols `IntuitionBase' klagen. In diesem Fall muß man also
lediglich das Folgende irgendwo im globalen Teil seines Quelltextes
einbauen:
struct Library *IntuitionBase;
(Und vergessen Sie nicht, die Library mit OpenLibrary() zu eröffnen und
mit CloseLibrary() zu schließen!) :-)
Allerdings könnte die Funktion natürlich tatsächlich fehlen. Wenn
man zum Beispiel nur die Version 2.0 der amiga.lib hat, dann fehlen
etwa die Locale-Funktionen oder die Memory-Pool-Funktionen, obwohl sie
prinzipiell verwendbar sind. (1) Die einfachste (und beste) Lösung
ist, das sogenannte NDU zu kaufen. Siehe Include-Dateien. Wer nicht
solange warten möchte, für den ist die Frage, welche Art von Funktion
in seiner Link-Library fehlt:
* Einfache Amiga-Library-Funktionen (z.B. `exec/AllocPooled' oder
`locale/OpenCatalogA') kann man mit Pragmas aufrufen und braucht
dann lediglich Informationen über die Aufrufkonventionen
(Library-Base, Library-Vektor-Offset und Argumentregister)
* Tag-Funktionen sind meistens einfach Zwischenfunktionen, die ihre
Argumente auf dem Stack erwarten und dann die eigentliche
Library-Funktion aufrufen. Wenn man z.B. die Funktion
`dos/AllocDosObject', die eine Konstante und einen Zeiger auf ein
Array als Argumente erwartet, nach der obigen Methode konstruiert
hat, dann hat man damit auch ihre Stack-Variante! Dazu erzeugt man
einfach die folgende Funktion:
#include
#include /* Evtl. anderer Name */
void *AllocDosObjectTags(ULONG objtype, Tag tag1, ...)
{ return(AllocDosObject(objtype, (struct TagItem *) &tag1);
}
Mit fd2pragma kann das auch automatisch geschehen. Siehe Pragmas.
* Einige Funktionen bleiben aber noch übrig: Amiga.lib enthält
nämlich auch Funktionen, die für sich selbst interessant sind,
z.B. die BOOPSI-Funktionen (`DoMethod', `DoSuperMethod'), die
Memory-Pool-Funktionen (`LibAllocPooled', `LibCreatePool', die
Ersatz für entsprechende 3.0-Funktionen sind) oder `HookEntry',
das sehr hilfreich bei der Programmierung von Hooks ist. Diese
kann man nur durch entsprechende, disassemblierte und neu
assemblierte oder compilierter Versionen ersetzen. Im
AmigaFAQ-Archiv sind einige dieser Funktionen bereits enthalten.
---------- Footnotes ----------
(1) Dieses Problem betrifft vor allem Besitzer von Aztec-C, das
seither nicht weiter unterstützt wird und von Dice, der manchmal etwas
unvollständig ist. Ich besitze beide ..
4.12 Wie erfahre ich, was für Funktionen es gibt?
=================================================
Wenn Sie sich über den Namen einer für einen bestimmten Zweck
geeigneten Funktion im Unklaren sind, dann gibt es folgende
Möglichkeiten:
* In den Autodocs der verschiedenen Libraries findet man am Anfang
eine alphabetisch sortierte Tabelle aller Funktionen, die die
betreffende Library bietet. Im Hauptteil findet man dann eine
detaillierte Spezifikation aller Funktionen. Siehe Include-Dateien.
* Die `.FD'-Dateien bieten eine sehr kompakte Übersicht über die
Funktionen der diversen Libraries, sogar mit einer kurzen Angabe
der Funktionsargumente. Wenn man schon grob weiß, wonach man
sucht (z.B. nur die grobe Angabe der Argumente benötigt), dann
findet man hier alle gewünschten Informationen. Siehe Pragmas.
Dr. Peter Kittel, peterk@cbmger.de.so.commodore.com
4.13 Der GNU C Compiler: Allgemeine Informationen und Installation
==================================================================
Dieser Abschnitt enthält Informationen über den Amiga-Port des GNU
C Compilers generell und die Installation insbesondere.
4.13.1 Aktuelle Version
-----------------------
Die aktuelle gcc-Version ist 2.6.0 und an 2.6.1 wird gearbeitet.
Sie enthält eine neue Version der ixemul.library (v40.3), aber man
sollte sich wegen Fehlern, die sich auf 68000-Systemen bemerkbar
machen, ixemul404.lha vom Aminet oder von meiner FTP-Site holen.
Außerdem gibt es eine neue library, libnix, die das Benützen der
ixemul.library verhindert. 2.6.1 wird Protos (wie bei SAS-C)
enthalten, um das Kompilieren von SASC-Code unter gcc leichter zu
machen. Ein neuer Assembler, gas-2.5, ist enthalten, ein Paket namens
q_anote ermöglicht die Ausgabe von gemischtem C/Asm-Code zu
Debugging-Zwecken. In Arbeit ist die Fähigkeit des Compilers, den
Stack wachsen zu lassen, damit man vor dem Starten von gcc nicht mehr
den Stack setzen muß.
4.13.2 Hardwareanforderungen
----------------------------
Jeder Amiga (vom A1000 bis zum A4000/40) ist prinzipiell in der
Lage, die GNU-Utilities für AmigaDOS zu benutzen. Allerdings braucht
man wenigstens 4MB RAM, um kleinere oder mittlere Projekte zu
übersetzen, für größere (z.B. für gcc selbst) entsprechend mehr.
Gigamem und VMM arbeiten mit gcc zusammen, es *könnte* also evtl.
auch mit weniger gehen. Dazu braucht man aber eine MMU. Siehe 68EC0xx.
Eine volle Installation mitsamt C++ und Objective-C, inline-Dateien
und Commodore Includes (siehe Include-Dateien) benötigt ca. 20 MB
Platz auf der Festplatte.
Kickstart 1.2/1.3 wird nicht mehr unterstützt. Wer KS 1.2/1.3 hat,
sollte sich eine bessere Kickstart-Version kaufen. Gcc arbeitet auch
unter Kickstart 1.2/1.3, die volle Funktionalität ist aber erst ab
Kickstart 2.x+ vorhanden. Eine schnelle CPU (z.B. 68030@25MHz oder
besser) ist ebenfalls sinnvoll.
4.13.3 Wer hat es gemacht?
--------------------------
Gcc und damit zusammenhängende Software wurde von den folgenden
Personen auf den Amiga portiert (siehe Hilfe):
Gcc v2.2.2: Markus Wild
Gcc v2.3.3: Markus Wild
Gcc v2.4.5: Philippe Brand, Lars Hecking, Fred Fish
Gcc v2.5.0 und später: Philippe Brand, Fred Fish, Leonard Norrgard
Ixemul.library: Markus Wild, Leonard Norrgard, R. Luebbert
Libnix: Matthias Fleischer, Gunther Nikl
Gerlib: Gerhard Müller
4.13.4 Wo finde ich die gcc-Quelltexte?
---------------------------------------
Alle gcc-Quelltexte und alle Binärdateien findet man auf:
1. Aminet (wuarchive.wustl.edu und Mirror wie ftp.luth.se) in
/pub/aminet/dev/gcc (siehe FTP)
2. Ramses The Amiga Flying BBS:
+33-1-60037015 HST Dual v32 terbo 4800-21600
+33-1-60037713 SupraFax v32bis 4800-14400
+33-1-60037716 Tornado v22bis 1200-2400
in Topic `Development', Area `Gcc' (are 156).
Den originalen GNU-Quelltext bekommt man
1. von denselben FTP-Servern wie die Binaries
2. gnu.prep.ai.mit.edu (18.71.0.38) in `/pub/gnu'
3. Ramses The Amiga Flying BBS in Topic
`AmigaUnix/Unix/Linux/NetBSD', Area `Gnu Source Code'
Diese Archive sollten alles Nötige enthalten, mit Ausnahme der
Quelltexte der ixemul.library. Diese erhält man ebenfalls auf dem
Aminet, Directory `dev/gcc'. (Zur Zeit ist die Version 40 der
ixemul.library in Arbeit. Die Quelltexte werden am gleichen Ort sein.)
Durch Richard Stallman, Free Software Foundation, ist festgelegt:
"The GPL says that any distribution of binaries must contain either
the source code or a written offer to supply source code (see the GPL
for details of what is required)."
Übersetzt: Die GPL (GNU General Public License) legt fest, daß jede
Distribution entweder den Quelltext oder das schriftliche (oder
geschriebene?) Angebot, diese zu liefern, enthalten muß. (Näheres
siehe in der GPL.)
4.13.5 Inline-Dateien
---------------------
Die Inline-Dateien für den gcc kann man aus den originalen
FD-Dateien von Commodore wie folgt erzeugen (Siehe Include-Dateien,
siehe Pragmas):
CLI> Assign INCLUDE: GCC:os-include
CLI> Assign FD: INCLUDE:fd
CLI> Makedir INCLUDE:inline
CLI> cd USR:bin/geninline
CLI> gen31
Dies sollte alle Inline-Dateien in `GCC:os-include/inline' erzeugen.
Falls man die 2.0- bzw. 3.0-Includes besitzt, sollte man gen20 bzw.
gen30 benutzen. Inline-Dateien für OS3.1 (rev 40.13) sind in
enthalten. Siehe Aktuelle Version. (1)
Auch mit dem Programm fd2inline kann man Inline-Dateien erzeugen:
CLI> fd2inline
---------- Footnotes ----------
(1) Perl Skripte haben Schwierigkeiten, die Include-Dateien von
AmigaDOS korrekt zu behandeln. Hier wäre etwas freiwillige Arbeit
nötig ...
4.13.6 Wie konvertiere ich die Amiga-Libraries für den gcc?
-----------------------------------------------------------
Ab gcc Version 2.6.0 werden dank den libnix-Autoren (Matthias
Fleischer und Gunther Nikl) AmigaDOS Linklibraries unterstützt.
Wenn man trotzdem eine gcc-Linklibrary generieren will, gibt es zwei
Methoden:
1. Mit hunk2gcc, dem AmigaDOS-Object-Konvertierer von Markus Wild.
Dazu braucht man zunächst eine aktuelle Kopie der amiga.lib (aus dem
NDU, siehe Include-Dateien). Nachdem man sich ein Directory für die
konvertierten Dateien erstellt hat, wechselt man mit cd in dieses
Directory und gibt das Folgende ein:
hunk2gcc amiga.lib [..further libs if you like..]
Dies erzeugt ein Objektfile wie a.out für jedes einzelne Modul, das
die Library enthält. Diese Module muß man anschließend in einer
gcc-Library zusammenfassen:
ar qc libamiga.a obj.*
ranlib libamiga.a
Das Programm ranlib fügt eine Symboltabelle in die Library ein.
(Dadurch wird der Zugriff auf die Library sehr viel schneller.)
2. Eine libamiga.a mit libnix zu generieren ist recht leicht, braucht
aber einige Zeit. Man dekomprimiere sources.lha aus dem libnix-Archiv
und starte ein 'make libamiga.a'.
*Beachte:* Solange man keine reinen AmigaDOS-Funktionen verwendet,
kann man auch eine Pseudo-Library erzeugen:
cat "int dummy;" >dummy.c
gcc -c dummy.c
ar crv libamiga.a dummy.o
mv libamiga.a gcc:lib
4.13.7 Wie installiere ich den gcc?
-----------------------------------
1. Falls dies die erste Installation von gcc ist:
Mache das Folgende:
cd ort_mit_sehr_viel_platz ; ÄNDERN! Gib eine Schublade an
makedir gnu
lha x gcc260-base.lha ; Der erste Teil, du brauchst ihn
Jetzt mußt du `gnu/s/user-startup' an dein `S:User-Startup'
anhängen (Ersetze Devel:GNU durch deinen eigenen Gnu Pfad).
Weiter:
execute gnu/s/user-startup ; setzt wichtige Assigns
copy gnu/envarc/#? ENVARC:
*Ändere* die folgenden Zeilen! Wenn du einen 68000- oder
68010-Amiga hast, entferne das "-020" aus allen folgenden Zeilen!
lha x gcc260-c-020.lha ; Der C-compiler; du brauchst ihn
lha x gcc260-doc.lha ; Wenn du die Dokumentation zu gcc willst
lha x gcc260-c++-020.lha ; Wenn du C++ haben willst
lha x gcc260-objc-020.lha ; Wenn du Objective-C haben willst
lha x gcc260-utils.lha ; Wenn du zusätzliche Utilities haben willst
; (empfohlen zur Kompatibilität mit Unix)
lha x gcc260-utilsdoc.lha ; Wenn du Dokumentation zu allen Utilities willst
Mit dem Script `restorelinks' mußt du Links generieren:
sh /gnu/s/restorelinks ; ÄNDERN! Füge " copy" an diese Zeile an,
; wenn du MakeLink nicht benützen willst,
; sondern Files lieber kopieren willst
Schließlich:
lha x gcc260-diffs.lha ; Wenn du gcc neu kompilieren willst
lha x gcc260-texi.lha ; Wenn du Postscript-Doku generieren willst
Auf zum nächsten Punkt und fröhliches Kompilieren!
2. Wenn du ein Upgrade deiner gcc-Umgebung von v2.5.x machen willst,
dearchiviere einfach gcc260-base.lha und gcc260-c-020.lha. Gehe
sicher, daß du deine frühere ixemul.library löschst, wo sie
sich auch befindet. (Üblicherweise in `LIBS:')
*Beachte*: Eine neue Version der ixemul.library wird verwendet, gehe
bitte sicher, daß nirgends eine andere Kopie ist, die in Konflikt mit
der neuen Version geraten kann.
4.13.8 Kompilieren
------------------
Wie wär's mit einem netten `Hello world'?
#include
main()
{
printf("Hello World!\n");
}
Das war recht einfach ;-) Jetzt müssen wir es kompilieren. Es gibt
eine Menge Optionen in gcc, aber die einfachste Möglichkeit zu
kompilieren ist:
CLI> gcc -o hello hello.c
Einfach? Hier sind mehr Optionen:
Ziel-Prozessoren von Motorola: Man kann reinen 68000 code, 68020,
68030, 68040 und/oder 68881 kompilieren. (Siehe Gcc-Dokumentation,
Kapitel `Invoking Gcc/SubModel Options/M680X0 Options for Motorola
specific compilation flags'.
CLI> gcc -m68020 -m68881 -o hello hello.c
Dies kompiliert Programme mit 68020 Code und direkten FPU-Befehlen
und bindet mit den beschleunigten Libraries aus `GCC:lib/lib020'.
Optimierung: Entweder du willst keine Optimierung oder du gibst `-O'
an, das den Code optimiert, oder `-O2' für bessere Optimierung (Siehe
die Dokumentation im Kapitel `Invoking Gcc/Optimize Options').
Inzwischen gibt es auch eine `-O3' Option, die noch weiter geht.
CLI> gcc -O2 -o hello hello.c
Ein schnelles "Hello World" ;-)
Codegenerierung: Vielleicht willst du residente Programme haben.
Die Option dazu heißt `-resident'.
CLI> gcc -resident -o hello hello.c
Natürlich kannst du alle Optionen mischen, so etwa:
CLI> gcc -O2 -m68020 -m68881 -resident -o hello hello.c
Dies wird ein hoch optimiertes residentes Programm für 68020 und
68881 ergeben.
*Wichtig:* Wenn du nur AmigaOS-Funktionen verwendest oder aus
irgendwelchen philosophischen Gründen keine ixemul.library verwenden
willst, dann kannst du diese loswerden durch:
CLI> gcc -noixemul -o foobar foobar.c
natürlich nur, wenn du libnix hast (enthalten in gcc 2.6.0).
4.13.9 Wichtige Informationsquellen
-----------------------------------
Der aktuelle Betreuer des Amiga-Ports von gcc ist:
Philippe BRAND
Fidonet: Ramses The Amiga Flying BBS 2:320/104.21
Email: phb@colombo.telesys-innov.fr (ONLY for personnal email).
Ftp: colombo.telesys-innov.fr:/pub/amigados-gnu
or /pub/incoming/uploads for uploads.
Es gibt auch eine Mail-Liste in Finnland. Siehe Mail-Listen.
Philippe Brand wird im Normalfall Fragen an diese Liste weiterleiten.
Section 2 of 2 - Prev - Next
| Back to category de-amiga-faq - Use Smart Search |
| Home - Smart Search - About the project - Feedback |
© allanswers.org | Terms of use