amiga-news ENGLISH VERSION
.
Links| Forum| Kommentare| News melden
.
Chat| Umfragen| Newsticker| Archiv
.

amiga-news.de Forum > Programmierung > Wie erstellt man eine Library in C? [ - Suche - Neue Beiträge - Registrieren - Login - ]

-1- 2 [ - Beitrag schreiben - ]

04.07.2006, 11:46 Uhr

Micha1701
Posts: 938
Nutzer
Hallo!

Ich hab mich mal selbst an einer Library versucht, aber da alles irgendwie kläglich scheitert versuch ichs mal auf diesem Wege:

Wie erstellt man überhaupt eine Library?
Was brauch ich dafür?
Wie muß ich den Compiler und Linker konfigurieren?
Was geht alles in einer Library und was nicht?
Worauf muß ich bei Standardfunktionen achten?
Was muß ich selber nachprogrammieren?

Als hintergrund sei noch anzumerken, daß ich mir den Quellcode des BladeMp3 Encoders besorgt habe und dieser nun lauffähig auf nem 68K Amiga ist. Jetzt würde ich gerne eine Library draus bauen - daran scheitere ich aber grad.

Die Probleme liegen hauptsächlich bei den Fließkommazahlen für die der vbcc die ieee.lib braucht. Diese will aber über einen startup Code initialisiert sein, was ja nicht geht. Verwende ich eine andere FPU Lib (z.B. für den 68881 oder 68040) gibts fehlende Referenzen zu so Funktionen wie z.B. _ieeeflts2d() oder _ieeemuld(). Die kann ich zwar über die Math.libraries mit z.B. IEEEDPFieee() oder IEEEDPMul() nachbauen, aber dann tauchen nach und nach fehlende Funktionen zur Umwandlung von Integer in Fließkommazahlen auf (z.B. _ieeefltuld() oder _ieeefltswl()) wo ich nur erraten kann was da für Eingabeparamter rein sollen...

Wer kann mir denn hier mal richtig ordentlich helfen? Anscheinend brauch ich ne kleine Einführung in die Library Programmierung. Mit ein paar Tipps zu Compiler/Linker Einstellungen scheint es nicht getan zu sein.



--
:boing: Micha :boing:

http://www.Silicon-Wizards.com

[ - Antworten - Zitieren - Direktlink - ]

04.07.2006, 14:58 Uhr

AmigaPapst
Posts: 980
Nutzer
@Micha1701:
Unter os3 ist das nicht so einfach, dagegen unter os4 schon einfacher. Hier findest du einen Workshop zur Erstellung einer OS4-Lib:
http://www.amiga-magazin.de/magazin/a12-05/osprogrammierung/index.html
--
:boing: AmigaOne XE G3 750FX 800Mhz/Sil0680/256MB + Radeon 9000 128 MB + AmigaOS 4
:dance1: A4000T CyberstormPPC 604e 200Mhz/060/128MB + CybervisionPPC 8MB + AmigaOS 3.9
und viele Amigas mehr...

[ - Antworten - Zitieren - Direktlink - ]

04.07.2006, 15:05 Uhr

thomas
Posts: 7717
Nutzer
Zitat:
Wie erstellt man überhaupt eine Library?
Was brauch ich dafür?
Wie muß ich den Compiler und Linker konfigurieren?
Was geht alles in einer Library und was nicht?
Worauf muß ich bei Standardfunktionen achten?
Was muß ich selber nachprogrammieren?


Wenn du nicht gleich mit einem riesigen Projekt anfangen würdest, müßtest du diese Fragen nicht stellen, sondern könntest sie selbst beantworten. Warum baust du dir nicht erst ein kleines Gerüst einer Library, die nur eine Funktion hat, die immer nur 12345 oder sowas zurückgibt ?

Zitat:
Die Probleme liegen hauptsächlich bei den Fließkommazahlen für die der vbcc die ieee.lib braucht.

Eben. Wenn du keine Fließkommazahlen benutzen würdest, hättest du auch kein Problem.

Zitat:
Diese will aber über einen startup Code initialisiert sein, was ja nicht geht.

Nicht wirklich. In der Anleitung steht sinngemäß, daß die Mathe-Library ihren eigenen Startup-Code dazulinkt, wenn das notwendig ist. Notwendig ist das dann, wenn die benötigten Lib-Bases der Math-Libs nicht deklariert sind.

Dementsprechend kannst du den Startup-Code sparen, indem du einfach die drei Base-Variablen MathIeeeSingBasBase, MathIeeeDoubBasBase und MathIeeeDoubTransBase global deklarierst und beim Initialisieren deiner Library füllst.

Zugegeben, das ist in der Anleitung nicht beschrieben und ich habe es durch ausprobieren bzw. durchsuchen der Datei mieee.lib herausgefunden, aber wie schon gesagt, wenn man nicht direkt mit einem großen Projekt anfängt, sondern sich mit kleinen Schritten vorwärts bewegt, kommt man auch an die fortgeschrittenen Themen leichter heran.

Gruß Thomas

--
Email: thomas-rapp@web.de
Home: thomas-rapp.homepage.t-online.de/

[ - Antworten - Zitieren - Direktlink - ]

04.07.2006, 15:09 Uhr

thomas
Posts: 7717
Nutzer
@AmigaPapst:
Zitat:
Unter os3 ist das nicht so einfach, dagegen unter os4 schon einfacher.

So ein Blödsinn. Eine OS4-Library enthält wesentlich mehr kompliziertes Zeugs als eine OS3-Library. Ob man nun eine XML-Datei oder eine FD-Datei erstellt ist ziemlich gleich.

Gruß Thomas


--
Email: thomas-rapp@web.de
Home: thomas-rapp.homepage.t-online.de/

[ - Antworten - Zitieren - Direktlink - ]

04.07.2006, 15:20 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von Micha1701:
Verwende ich eine andere FPU Lib (z.B. für den 68881 oder 68040) gibts fehlende Referenzen zu so Funktionen wie z.B. _ieeeflts2d() oder _ieeemuld().


Du solltest immer die passende Bibliothek für Dein target benutzen. Wenn Du also für Systeme mit FPU übersetzen willst, dann auch mit der FPU-Option:
vc -fpu=68881 ... -lm881
oder besser
vc -cpu=68020 -fpu=68881 ... -lm881
denn 68000 + FPU gibt IMHO nicht.

Und für 68040/68060:
vc -cpu=68040 -fpu=68040 ... -lm040

Dann solltest Du auch keine Probleme mit fehlenden math-Funktionen mehr haben.

mfg
--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Antworten - Zitieren - Direktlink - ]

04.07.2006, 15:26 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von thomas:
Warum baust du dir nicht erst ein kleines Gerüst einer Library, die nur eine Funktion hat, die immer nur 12345 oder sowas zurückgibt?


Ich dachte, es gäbe irgendwo im Aminet ein Grundgerüst für ne Library in C, habe aber jetzt nix gefunden. Habe ich mich getäuscht oder nur nicht das richtige Keyword gesucht?

Würde mich mal interessieren...

mfg
--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Antworten - Zitieren - Direktlink - ]

04.07.2006, 15:41 Uhr

thomas
Posts: 7717
Nutzer

http://www.aminet.net/package.php?package=dev/c/CLib37x.lha

Das ist aber IMHO noch viel zu kompliziert gemacht. Es ist mit vielen vielen #ifdefs an so gut wie alle Compiler angepaßt. Das hätte man lesbarer machen können.

Gruß Thomas

--
Email: thomas-rapp@web.de
Home: thomas-rapp.homepage.t-online.de/

[ - Antworten - Zitieren - Direktlink - ]

04.07.2006, 16:24 Uhr

Gazelle
Posts: 151
Nutzer
Zitat:
Original von thomas:
Nicht wirklich. In der Anleitung steht sinngemäß, daß die Mathe-Library ihren eigenen Startup-Code dazulinkt, wenn das notwendig ist. Notwendig ist das dann, wenn die benötigten Lib-Bases der Math-Libs nicht deklariert sind.

Dementsprechend kannst du den Startup-Code sparen, indem du einfach die drei Base-Variablen MathIeeeSingBasBase, MathIeeeDoubBasBase und MathIeeeDoubTransBase global deklarierst und beim Initialisieren deiner Library füllst.

Zugegeben, das ist in der Anleitung nicht beschrieben ...


VBCC.pdf; Kapitel 11.4.6 Minimal startup:
...
If you want to use floating point with the IEEE libraries you have to define and open MathIeeeSingBas.library, MathIeeeDoubBas.library and MathIeeeDoubTrans.library (in this order!) and link with mieee.lib (if compiled for FPU this is not needed).
...

Zugegeben etwas versteckt, aber immerhin doch da.

Noch interessanter ist der Hinweis in den Autodocs für die Verwendung der mathieee(sing|doub)(bas|trans).library in einer eigenen Lib. Das sollte man sich vielleeicht auch zu Gemüte führen.

[ - Antworten - Zitieren - Direktlink - ]

04.07.2006, 16:32 Uhr

whose
Posts: 2156
Nutzer
Zitat:
Original von thomas:

http://www.aminet.net/package.php?package=dev/c/CLib37x.lha

Das ist aber IMHO noch viel zu kompliziert gemacht. Es ist mit vielen vielen #ifdefs an so gut wie alle Compiler angepaßt. Das hätte man lesbarer machen können.


Hm, wäre vielleicht an der Zeit für ein aktuelleres Beispiel, evtl. unter Benutzung der SDI-Includes?

Grüße

--
---

:boing: µA1 PPC 750GX-800
:boing: A4000 PPC 604e-233

[ - Antworten - Zitieren - Direktlink - ]

04.07.2006, 20:05 Uhr

gni
Posts: 1106
Nutzer
Zitat:
whose:
Hm, wäre vielleicht an der Zeit für ein aktuelleres Beispiel, evtl. unter Benutzung der SDI-Includes?

AFAIK gibt es auch eine Beispielbibliothek von Dirk Stöcker. Ansonsten mal den quellcode von mpega_libmad anschauen ;-)

[ - Antworten - Zitieren - Direktlink - ]

04.07.2006, 23:39 Uhr

whose
Posts: 2156
Nutzer
Zitat:
Original von gni:
Zitat:
whose:
Hm, wäre vielleicht an der Zeit für ein aktuelleres Beispiel, evtl. unter Benutzung der SDI-Includes?

AFAIK gibt es auch eine Beispielbibliothek von Dirk Stöcker. Ansonsten mal den quellcode von mpega_libmad anschauen ;-)

;)

Im Prinzip ne gute Idee, aber durch die reichlich verteilten #ifdefs doch etwas schwer zu durchblicken. Da wäre ein klares, einfaches Beispiel doch besser, finde ich. Jeweils eins für alle Systeme, dann blickt man vermutlich alle leichter.

Aber nichts desto trotz, wer sich ansehen will, wie ne Library für verschiedene Systeme und verschiedene Compiler erstellt wird, dem sei mpega_libmad ans Herz gelegt. Geht sogar mit StormC4 :D

Grüße

--
---

:boing: µA1 PPC 750GX-800
:boing: A4000 PPC 604e-233

[ - Antworten - Zitieren - Direktlink - ]

05.07.2006, 08:46 Uhr

Micha1701
Posts: 938
Nutzer
@Thomas:
Natürlich hatte ich vorher ein einfaches Beispiel kompiliert. Mußte ja überprüfen, ob das überhaupt klappt. Hab im übrigen das Beispiel von Dirk Stoecker aus dem AmiNet genommen.

Danke für den Hinweis auf das Manual. Hab gar nicht dran gedacht, daß sowas beim vbcc beiliegen könnte... :glow:

Ich habs auch nochmal mit dem kleinen Beispiel versucht. Nichts großes, einfach nur 2 double Zahlen multipliziert und das dann mit der IEEE.lib kompiliert. Und tatsächlich, es klappt... Na toll...

Wenn ich das aber gegen den ganzen Quellcode laufen lasse, dann will die ieee.lib nicht mehr. Hier mal ein Auszug aus dem Make-output:
code:
vbcc:bin/vc -cpu=68020 -lmieee -cpp-comments -D__NOLIBBASE__
 -ICubic:workspace/bladelib2/include/C/ -lamiga -nostdlib -fpu=68881 -c -o o/vbcc-classic/codec.o
 codec.c

vbcc:bin/vc -cpu=68020 -lmieee -cpp-comments -D__NOLIBBASE__
 -ICubic:workspace/bladelib2/include/C/ -lamiga -nostdlib -fpu=68881 -o bin/vbcc-classic/bladelib2
 o/vbcc-classic/tables.o o/vbcc-classic/subs.o o/vbcc-classic/samplein.o o/vbcc-classic/reservoir.o
 o/vbcc-classic/mdct.o o/vbcc-classic/mainfuncs.o o/vbcc-classic/loop.o o/vbcc-classic/libinit.o
 o/vbcc-classic/l3psy.o o/vbcc-classic/l3bitstream.o o/vbcc-classic/ieee.o
 o/vbcc-classic/formatbitstream2.o o/vbcc-classic/examplefuncs.o o/vbcc-classic/encode.o
 o/vbcc-classic/common.o o/vbcc-classic/codec.o

Error 21: mieee.lib(math/_mathmain.c) (CODE+0x90): Reference to undefined symbol _fclose.
mieee.lib(math/_mathmain.c): In "l24":
Error 21: mieee.lib(math/_mathmain.c) (CODE+0xaa): Reference to undefined symbol _fclose.
mieee.lib(math/_mathmain.c): In "l27":
Error 21: mieee.lib(math/_mathmain.c) (CODE+0xb6): Reference to undefined symbol ___freemem.
Error 21: mieee.lib(math/_mathmain.c) (CODE+0xc0): Reference to undefined symbol __exit.
mieee.lib(math/_mathmain.c): In "__main":
Error 21: mieee.lib(math/_mathmain.c) (CODE+0x108): Reference to undefined symbol _malloc.
Error 21: mieee.lib(math/_mathmain.c) (CODE+0x118): Reference to undefined symbol _malloc.
Error 21: mieee.lib(math/_mathmain.c) (CODE+0x128): Reference to undefined symbol _malloc.
mieee.lib(math/_mathmain.c): In "l42":
Error 21: mieee.lib(math/_mathmain.c) (CODE+0x160): Reference to undefined symbol __stdin.
Error 21: mieee.lib(math/_mathmain.c) (CODE+0x172): Reference to undefined symbol __stdin.
mieee.lib(math/_mathmain.c): In "l46":
Error 21: mieee.lib(math/_mathmain.c) (CODE+0x19a): Reference to undefined symbol __stdout.
Error 21: mieee.lib(math/_mathmain.c) (CODE+0x1ac): Reference to undefined symbol __stdout.
mieee.lib(math/_mathmain.c): In "l48":
Error 21: mieee.lib(math/_mathmain.c) (CODE+0x1d6): Reference to undefined symbol __stderr.
Error 21: mieee.lib(math/_mathmain.c) (CODE+0x1e8): Reference to undefined symbol __stderr.
mieee.lib(math/_mathmain.c): In "l66":
Error 21: mieee.lib(math/_mathmain.c) (CODE+0x354): Reference to undefined symbol _main.

vlink fehlgeschlagen Rückgabewert 20
vlink -bamigahunk -x -Bstatic -Cvbcc -nostdlib -Lvlibos3: -FT:t_8_0  -lmieee -lamiga -s -R -o
 bin/vbcc-classic/bladelib2 failed
make: *** [bin/vbcc-classic/bladelib2] Error 20
Done.

Die MathBases hab ich alle global deklariert. Die geben ja auch keine Porbleme. Dann wirds wohl an einer speziellen Funktion liegen, daß die ieee.lib da doch etwas mehr Initialisierung braucht, oder?
--
:boing: Micha :boing:

http://www.Silicon-Wizards.com

[ - Antworten - Zitieren - Direktlink - ]

05.07.2006, 09:24 Uhr

Micha1701
Posts: 938
Nutzer
Hab jetzt nochmal rumprobiert, an welchen Funktionen es liegt. Ein Source hatte ein paar malloc(), free(), printf(), exit() und memcpy() drin. Und die haben wohl gestört... Hab sie gegen exec Funktionen ausgetauscht und nun gibts keine ieee.lib Fehler mehr.

Hätt nicht gedacht, daß die ANSI Funktionen probleme mit der IEEE.lib machen. Nicht das ihr denkt, daß ich die drin lassen wollte, aber ich dachte fang ich eben mit dem IEEE Problem zuerst an...

Naja, somit hat sich das ganze Problem wohl erledigt und ich hab wieder einiges dazugelernt.

Vielen Dank an alle!

--
:boing: Micha :boing:

http://www.Silicon-Wizards.com

[ - Antworten - Zitieren - Direktlink - ]

05.07.2006, 09:35 Uhr

Gazelle
Posts: 151
Nutzer
code:
vbcc:bin/vc -cpu=68020 -lmieee -cpp-comments -D__NOLIBBASE__
 -ICubic:workspace/bladelib2/include/C/ -lamiga -nostdlib -fpu=68881 -c -o o/vbcc-classic/codec.o
 codec.c


Wenn Du -fpu=68881 verwendest, solltest Du auch mit der richtigen math-lib (-lm881) linken.
Soweit ich das verstehe ist die mieee lib nur dann nötig, wenn du KEINE fpu hast.

[ - Antworten - Zitieren - Direktlink - ]

05.07.2006, 13:21 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von Micha1701:
Hätt nicht gedacht, daß die ANSI Funktionen probleme mit der IEEE.lib machen.

Es besteht noch nicht mal ein Zusammenhang, von einer Schuld seitens der mieee.lib ganz zu schweigen.
Zitat:
Naja, somit hat sich das ganze Problem wohl erledigt und ich hab wieder einiges dazugelernt.
Kommt mir, ehrlich gesagt, nicht so vor.

mfg
--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Antworten - Zitieren - Direktlink - ]

05.07.2006, 15:39 Uhr

Micha1701
Posts: 938
Nutzer
@Holger:
Aber nachdem ich die ANSI Funktionen ausgebaut habe kompilierte das ganze perfekt durch...
--
:boing: Micha :boing:

http://www.Silicon-Wizards.com

[ - Antworten - Zitieren - Direktlink - ]

05.07.2006, 16:01 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von Micha1701:
@Holger:
Aber nachdem ich die ANSI Funktionen ausgebaut habe kompilierte das ganze perfekt durch...


Ja eben. Wenn Du die ANSI-Funktionen nicht mehr benutzt, die Dir ja fehlen, weil Du mit -nostdlib übersetzt, dann gibt es auch keine unresolved Referenzen auf Teile der Standard-Bibliothek.

Deine konsequente Weigerung, die richtige Version der Math-Bibliothek für Deine target-CPU/FPU zu benutzen, bleibt weiterhin unverständlich.

Genauso wie Dein Beharren auf dem Standpunkt, daß die mieee.lib Schuld an der Sache wäre, obwohl Du von Anfang an wußtest, daß Dein code immer noch Funktionen der stdlib benutzt hatte...

mfg
--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Antworten - Zitieren - Direktlink - ]

10.07.2006, 11:11 Uhr

Micha1701
Posts: 938
Nutzer
Wie dem auch sei, jetzt funktioniert alles...

Bleibt nur noch eine Frage:

Wie muß ein Funktionsaufruf in der SFD Datei deklariert werden, damit man nicht mit einem Array aus TagItems sondern mit einer variabel langen Liste aus TagItems aufrufen kann? Also daraus statt einem amicall ein tagcall entsteht?


--
:boing: Micha :boing:

http://www.Silicon-Wizards.com

[ - Antworten - Zitieren - Direktlink - ]

10.07.2006, 13:31 Uhr

Solar
Posts: 3680
Nutzer
Zitat:
Original von Micha1701:
Wie dem auch sei, jetzt funktioniert alles...


...bis zum nächsten Problem. Deine Fehlerquelle ist nicht gelöst, nur umgangen, und nach meinem Eindruck auch nicht verstanden.

Ich glaube nicht, das Holger auf diese Weise noch lange Lust hat, Dir zu helfen...

[ Dieser Beitrag wurde von Solar am 10.07.2006 um 13:32 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

10.07.2006, 14:35 Uhr

Micha1701
Posts: 938
Nutzer
Aber ihr wollt mir doch jetzt nicht etwa sagen, daß es ein Fehler wäre statt der m881.lib die ieee.lib zu benutzen, oder? Ob jetzt direkte FPU Befehle benutzt werden oder eben die Math.libraries ist doch eigentlich egal - oder etwa nicht?

Ich gebe zu, daß ich erst die ganzen ANSI Funktionen hätte austauschen sollen, bevor ich hier mit meinem FPU Problem aufgetaucht bin - da war ich definitiv zu voreilig. Aber dennoch läuft das ganze jetzt einwandfrei...

Und auch wenn es vielleicht nicht so aussieht, ich bin immer sehr dankbar für jede angebotene Hilfe - nur wenn ich das dann anders gelöst bekomme darf man mir das nicht übel nehmen...

Ein paar der Probleme mit meiner Library sind auch dadurch entstanden, daß die LIB eben ein paar global definierte LibraryBases brauchte (was mir ja nicht aufgefallen ist). Die waren aber im Beispiel von Dirk Stöcker über #defines abgeändert. Dadurch funktionierten die Library Funktionen zwar (weil dann statt SysBase eben blademp3Base->exb_SysBase verwendet wurde), aber damit kann eine dazugelinkte LIB nichts anfangen. Gut, daß hab ich dann ja auch mit Hilfe der hier anwesenden verstanden und abgeändert...

Daß man auf sowas als Helfer nicht direkt kommt ist klar - man kennt ja den Quellcode nicht. Daher hab ich auch immer versucht die Fragen etwas allgemeiner zu stellen - wobei ich dabei natürlich nicht genau wußte, was für Informationen dabei von nöten sind...

Wenn jetzt irgendwer immernoch der Meinung ist, daß ich einfach alles falsch gemacht habe und die von mir erstellte Library ist der größte Müll, dem sende ich gerne den Quellcode zu (ist ja immerhin OpenSource). Dann kann er den durchsehen, überprüfen und mir anschließend um die Ohren hauen... :)

--
:boing: Micha :boing:

http://www.Silicon-Wizards.com


[ Dieser Beitrag wurde von Micha1701 am 10.07.2006 um 14:42 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

10.07.2006, 14:40 Uhr

Micha1701
Posts: 938
Nutzer
Zitat:
Original von Holger:
Genauso wie Dein Beharren auf dem Standpunkt, daß die mieee.lib Schuld an der Sache wäre, obwohl Du von Anfang an wußtest, daß Dein code immer noch Funktionen der stdlib benutzt hatte...


Ich hab nicht darauf beharrt das die IEEE.lib Fehler macht, ich ging nur davon aus, daß ich bei der Anbindung der Lib noch was falsch gemacht habe. Dazu gehörten die global definierten MathBases und anscheinend noch ANSI Funktionen die irgendwelche Nebeneffekte aufgerufen haben. Zumindest als diese ANSI Funktionen weg waren kompilierte alles ohne Fehler durch...


--
:boing: Micha :boing:

http://www.Silicon-Wizards.com

[ - Antworten - Zitieren - Direktlink - ]

10.07.2006, 15:46 Uhr

Solar
Posts: 3680
Nutzer
Zitat:
Original von Micha1701:

Wenn jetzt irgendwer immernoch der Meinung ist, daß ich einfach alles falsch gemacht habe und die von mir erstellte Library ist der größte Müll...


So hab' ich's nicht gemeint, und ich bin auch alles andere als ein Fachmann für Amiga-Libs. Aber Du hast dreier Leute Rat mit einem "wie dem auch sei, jetzt geht's" abgewunken (ohne auf die Ratschläge einzugehen) und die nächste Frage gestellt. Ich wollte nur zum Ausdruck bringen, das ich an dieser Stelle keine Lust mehr hätte, Dir auf dem Niveau zu helfen. ;)

[ - Antworten - Zitieren - Direktlink - ]

10.07.2006, 15:48 Uhr

malte2
Posts: 148
Nutzer
Falls noch keiner darauf hingewiesen hat, so möchte ich zu Bedenken geben, daß die Mathe Libraries für jeden Task der sie benutzt (direkt oder indirekt) auch extra geöffnet werden müssen (wie bsdsocket). Man kann die 'Bases' nicht mit anderen Tasks teilen.

[ - Antworten - Zitieren - Direktlink - ]

10.07.2006, 16:01 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von Micha1701:
Aber ihr wollt mir doch jetzt nicht etwa sagen, daß es ein Fehler wäre statt der m881.lib die ieee.lib zu benutzen, oder? Ob jetzt direkte FPU Befehle benutzt werden oder eben die Math.libraries ist doch eigentlich egal - oder etwa nicht?

Wenn Du Dir Dein erstes Posting ansiehst, wirst Du Dich vielleicht daran erinnern, daß Du angefangen hast, Funktionen über math-Bibliotheken nachzubauen, weil Dein Mischen von inkompatiblen Compiler-Einstellungen und link-Bibliotheken nicht richtig funktioniert hat.

Du mußt Dir einfach darüber klar werden, daß je nach gewählten Zielprozessor unterschiedlich header (oder Teile davon) zum Einsatz kommen, und diese auch auf die Link-Bibliotheken abgestimmt sind. Z.B. werden sich als inline-code realisierte Funktionen in den Bibliotheken nicht wieder finden.

Und selbst wenn Du es schaffst, diese nicht zusammenpassende Kombination zum Laufen zu bekommen, mußt Du damit rechnen, daß mit einem anderen Compiler oder schon nach einem Update auf eine neuere Version dieses Compilers, Dir das Ganze um die Ohren fliegt. Und dann, vielleicht Jahre nachdem Du diese Software zusammengepfriemelt hast, wirst Du wieder ratlos davorstehen und nicht die kleinste Idee haben, warum plötzlich nichts mehr funktioniert.

Zitat:
Und auch wenn es vielleicht nicht so aussieht, ich bin immer sehr dankbar für jede angebotene Hilfe - nur wenn ich das dann anders gelöst bekomme darf man mir das nicht übel nehmen...
Man kann auch den Autobau "anders" lösen und alles mit Heißkleber und Klebeband zusammenbringen. Aber der TÜV wird aus guten Grund etwas dagegen haben.

Nur weil etwas im Augenblick nicht gleich auseinanderfällt, ist es noch lange keine Lösung.
Zitat:
Wenn jetzt irgendwer immernoch der Meinung ist, daß ich einfach alles falsch gemacht habe und die von mir erstellte Library ist der größte Müll, dem sende ich gerne den Quellcode zu (ist ja immerhin OpenSource). Dann kann er den durchsehen, überprüfen und mir anschließend um die Ohren hauen... :)

Nu übertreib mal nicht gleich. Für's erste reicht es, wenn Du Deinen Quellcode mit konsistenten Compiler-Optionen übersetzt. Und Dich dazu mal entscheidest, ob Du nun eine FPU-Version, eine no-FPU Version oder zwei verschiedene Versionen erzeugen willst.

mfg
--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Antworten - Zitieren - Direktlink - ]

10.07.2006, 16:30 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von malte2:
Falls noch keiner darauf hingewiesen hat, so möchte ich zu Bedenken geben, daß die Mathe Libraries für jeden Task der sie benutzt (direkt oder indirekt) auch extra geöffnet werden müssen (wie bsdsocket). Man kann die 'Bases' nicht mit anderen Tasks teilen.


Wo steht das denn? In den Docs zu den Bibliotheken selber habe ich nichts dazu gefunden...

mfg
--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Antworten - Zitieren - Direktlink - ]

10.07.2006, 17:07 Uhr

Micha1701
Posts: 938
Nutzer
Zitat:
Original von Holger:
Nu übertreib mal nicht gleich. Für's erste reicht es, wenn Du Deinen Quellcode mit konsistenten Compiler-Optionen übersetzt. Und Dich dazu mal entscheidest, ob Du nun eine FPU-Version, eine no-FPU Version oder zwei verschiedene Versionen erzeugen willst.


Aber ist es nicht genau daß was ich mit der IEEE.lib umgehe? Ich dachte immer die Math.libraries verwenden die CPU zur Berechnung der Fließkommazahlen, wenn keine FPU zur Verfügung steht. Wenn nicht dafür wofür sind die denn sonst?


--
:boing: Micha :boing:

http://www.Silicon-Wizards.com

[ - Antworten - Zitieren - Direktlink - ]

10.07.2006, 17:31 Uhr

ZeroG
Posts: 1487
Nutzer
@Holger:
NDK3.9 mathieeesingbas.doc:

CAVEATS

The library base of the mathieeesingbas.library MUST NOT be shared
among tasks. The reason for this restriction is that the library
open vector requires to initialize the FPU properly for the caller's
task context.

Für die anderen Mathelibraries entsprechend...

[ - Antworten - Zitieren - Direktlink - ]

10.07.2006, 17:37 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von Micha1701:
Aber ist es nicht genau daß was ich mit der IEEE.lib umgehe? Ich dachte immer die Math.libraries verwenden die CPU zur Berechnung der Fließkommazahlen, wenn keine FPU zur Verfügung steht. Wenn nicht dafür wofür sind die denn sonst?


Worin liegt der Sinn, in Deinem Programm/Deiner Bibliothek FPU-Befehle zu benutzen und gleichzeitig eine Bibliothek zu verwenden, die nur eventuell FPU-Befehle nutzt?

Also entweder FPU-Version oder noFPU-Version. Und verwechsel nicht die link-Library Deines Compilers mit den math-Libraries des Systems. Die link-Library Deines Compilers enthält prozessorspezifischen Code, der immer an Deinem Programm hängen wird, auch wenn er im Hintergrund eine Bibliothek des Systems benutzt, die vielleicht austauschbar ist.

mfg
--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Antworten - Zitieren - Direktlink - ]

10.07.2006, 18:08 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von ZeroG:
@Holger:
NDK3.9 mathieeesingbas.doc:

CAVEATS

The library base of the mathieeesingbas.library MUST NOT be shared
among tasks. The reason for this restriction is that the library
open vector requires to initialize the FPU properly for the caller's
task context.

Für die anderen Mathelibraries entsprechend...


Cool.
Noch in AOS3.5 findet sich davon kein einziges Wort, auch nicht davon, daß man mathieeesing... und mathieeedoub... nicht gleichzeitig verwenden darf, wenn man nicht plötzlich falsche Ergebnisse haben will.

Fazit: erst in AOS3.9 hat jemand Versionen geschrieben, die tatsächlich die FPU benutzen und danach wurden die entstandenen Inkompatiblitäten als neue Standard-Verhaltensweise definiert.

Falls noch irgendwer wissen wollte, warum H&P als Abkürzung für Hack&Patch gehandelt wird -> ...

Sollte aber niemand erwarten, daß sich Software, die vor dem Erscheinen von AOS3.9 geschrieben wurde, daran hält.

mfg

PS: Gibt's das NDK3.9 noch irgendwo offiziell zum download?

[ - Antworten - Zitieren - Direktlink - ]

10.07.2006, 18:41 Uhr

tboeckel
Posts: 124
Nutzer
@Holger:
Zitat:
The library base of the mathieeesingbas.library MUST NOT be shared among tasks.
Lies diesen Satz noch mal mit ganz viel Verstand von vorne bis hinten durch. Da steht nichts davon drin, daß man die mathieeesing#? und die mathieeedoub#? nicht gleichzeittig verwenden darf.

Der Satz besagt nur, daß du in einem multi-threaded Programm die Bibliotheken in JEDEM Subtask öffnen mußt, bevor der Subtask sie benutzen darf. Der alte Trick, daß das Hauptprogramm alle Bibliotheken öffnet und alle weiteren Subtasks munter dieselben Basisadressen verwenden, klappt nämlich genau bei sämtlichen math#?.library NICHT. Das ist hier mit shared among tasks gemeint.

Ich meine dieses Verhalten wäre bereits unter OS1.3 so gewesen, wo so langsam die ersten Turbokarten mit FPU in Mode kamen. Spätestens ab OS2.x war es dann dokumentiert, daß ein OpenLibrary("mathieeesingbas.library",0) eine task-spezifische Basisadresse liefert.

Dieses Verhalten ist bereits auf der Developer-CD 1.1 von 1996 in den AmigaMails vol 1 dokumentiert, und die sind von 1990!

[ - Antworten - Zitieren - Direktlink - ]


-1- 2 [ - Beitrag schreiben - ]


amiga-news.de Forum > Programmierung > Wie erstellt man eine Library in C? [ - Suche - Neue Beiträge - Registrieren - Login - ]


.
Impressum | Datenschutzerklärung | Netiquette | Werbung | Kontakt
Copyright © 1998-2024 by amiga-news.de - alle Rechte vorbehalten.
.