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

amiga-news.de Forum > Programmierung > Fließkommazahlen in Library [ - Suche - Neue Beiträge - Registrieren - Login - ]

-1- [ - Beitrag schreiben - ]

27.06.2006, 09:23 Uhr

Micha1701
Posts: 938
Nutzer
Hi!

Nächstes Problem. Ich brauche Fließkommazahlen in meiner Library. Dafür könnte ich ja einfach mit der ieee.lib linken. Aber die will wohl eine Initialisierung. Zumindest bekomm ich beim compilieren Fehler in der Art:

Zitat:
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+0x178): Reference to undefined symbol _DOSBase.
mieee.lib(math/_mathmain.c): In "l46":
Error 21: mieee.lib(math/_mathmain.c) (CODE+0x19a): 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.
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: "o/vbcc-classic/mainfuncs.o"
"o/vbcc-classic/libinit.o" "o/vbcc-classic/examplefuncs.o" -lmieee -s -R -o
bin/vbcc-classic/blademp3.library failed
make: *** [bin/vbcc-classic/blademp3.library] Error 20
Done.


Wenn ich mit m881.lib oder m040.lib linke gibts ähnliche Fehler...

Jemand ne Ahnung wie ich das Problem beheben oder umgehen kann? Muß ich vielleicht direkt die Math.librarys ansprechen? Das wäre allerdings echt mega umständlich...
--
:boing: Micha :boing:

http://www.Silicon-Wizards.com

[ - Antworten - Zitieren - Direktlink - ]

27.06.2006, 11:51 Uhr

gni
Posts: 1106
Nutzer
Zitat:
Micha1701:
Muß ich vielleicht direkt die Math.librarys ansprechen? Das wäre allerdings echt mega umständlich...

Du solltest die Bibliotheken zumindest selber öffnen und deren Basis auch selber deklarieren.

[ - Antworten - Zitieren - Direktlink - ]

27.06.2006, 13:48 Uhr

Micha1701
Posts: 938
Nutzer
ok, hab jetzt die mathieeesingbas.library eingebaut. Wenn ich die bei float werten benutze gibts auch keine Probleme. Aber jetzt kann ich anscheinend keine einfache Division mit ints mehr machen. Gibt dann den Fehler das __ldivs nicht gefunden werden konnte...

Das bringts ja nun auch nicht wirklich...



--
:boing: Micha :boing:

http://www.Silicon-Wizards.com

[ - Antworten - Zitieren - Direktlink - ]

27.06.2006, 21:03 Uhr

gni
Posts: 1106
Nutzer
Zitat:
Micha1701:
ok, hab jetzt die mathieeesingbas.library eingebaut. Wenn ich die bei float werten benutze gibts auch keine Probleme.

In einer shared library muß man halt viele Dinge selber erledigen.
Zitat:
Aber jetzt kann ich anscheinend keine einfache Division mit ints mehr machen. Gibt dann den Fehler das __ldivs nicht gefunden werden konnte...
Dann wirst Du vermutlich nicht richtig linken... Wie genau kompilierst Du und wie linkst Du?

[ - Antworten - Zitieren - Direktlink - ]

27.06.2006, 21:09 Uhr

Ralf27
Posts: 2779
Nutzer
Das kommt mir irgendwie bekannt vor. Ich kenne das von vbcc. Benutze doch einfach beim Compilieren noch folgende Optionen dazu:
-lauto -lmieee

Dann dürfte es laufen. :)
--
http://www.alternativercomputerclub.de.vu

[ - Antworten - Zitieren - Direktlink - ]

27.06.2006, 22:59 Uhr

Micha1701
Posts: 938
Nutzer
Zitat:
Original von Ralf27:
Das kommt mir irgendwie bekannt vor. Ich kenne das von vbcc. Benutze doch einfach beim Compilieren noch folgende Optionen dazu:
-lauto -lmieee


Der Fehler oben entsteht, wenn ich mit -lieee kompiliere. Das ist ja das Problem. Hier gehts ja nicht um ein normales Programm sondern ich will eine Library programmieren. Und da werden die Initialisierungen wohl nicht durchgeführt...


Zitat:
Original von gni:
Wie genau kompilierst Du und wie linkst Du?

Steht doch da :-)
code:
vlink -bamigahunk -x -Bstatic -Cvbcc -nostdlib -Lvlibos3: "o/vbcc-classic/mainfuncs.o"
"o/vbcc-classic/libinit.o" "o/vbcc-classic/examplefuncs.o" -lmieee -s -R -o

Optionen für die Kompilierung werd ich morgen früh mal nachsehen...


--
:boing: Micha :boing:

http://www.Silicon-Wizards.com


[ Dieser Beitrag wurde von Micha1701 am 27.06.2006 um 23:00 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

28.06.2006, 07:33 Uhr

Micha1701
Posts: 938
Nutzer
Zitat:
Original von gni:
Wie genau kompilierst Du und wie linkst Du?


Hier der Befehl zum kompilieren:
code:
vbcc:bin/vc -cpp-comments -D__NOLIBBASE__ -ICubic:workspace/bladelib2/include/C/ -nostdlib -o
 bin/vbcc-classic/blademp3.library o/vbcc-classic/mainfuncs.o o/vbcc-classic/libinit.o
 o/vbcc-classic/examplefuncs.o

--
:boing: Micha :boing:

http://www.Silicon-Wizards.com

[ - Antworten - Zitieren - Direktlink - ]

28.06.2006, 08:26 Uhr

Micha1701
Posts: 938
Nutzer
Also so wie ich das jetzt alles verstanden habe, ist es doch so, daß man in einer Library keine linkLib benutzen kann. Also muß man wohl oder übel die Funktionen der math.libraries benutzen (z.B. MathIeeeSingBas.Library). OK, das ist übel, aber nun gut, da muß ich halt durch.

Aber eine einfache Integer Division oder Multiplikation geht dann auch nicht mehr? Dafür muß ich dann tatsächlich die Utility.library benutzen (also SDivMod32() und SMul32())? Das ist heftig...

Da macht Library erstellen erst so richtig Spaß, was...? :(
--
:boing: Micha :boing:

http://www.Silicon-Wizards.com

[ - Antworten - Zitieren - Direktlink - ]

28.06.2006, 10:44 Uhr

tboeckel
Posts: 124
Nutzer
@Micha1701:

natürlich darf man Link-Libraries benutzten, nur nicht alle Funktionen davon. Generell darf alles verwendet werden, was keinen impliziten Kontext bzw die Laufzeitumgebung braucht und alles, was thread-safe ist. D.h. Divisionen/Multiplikationen dürfen auf jeden Fall verwendet werden, ebenso die str#? Funktionen.

NICHT verwendet werden darf zB jede Art von I/O (open, read, write, printf, etc) und die Speicherverwaltung (malloc, free), weil dafür die nötigen Strukturen durch den nicht vorhandenen Startup-Code nicht initialisiert worden sind. Für solche Fälle muß man den direkten Ersatz vom AmigaOS (dos/Open/Read/Write, exec/AllocMem/FreeMem, etc) benutzen.

Mit Sicherheit gibt es noch eine Reihe weiterer Funktionen, die in shared libraries benutzt bzw nicht benutzt werden dürfen, aber die beschriebenen sind die, die man am ehesten benutzen möchte.

[ - Antworten - Zitieren - Direktlink - ]

28.06.2006, 11:32 Uhr

Micha1701
Posts: 938
Nutzer
Zitat:
Original von tboeckel:
natürlich darf man Link-Libraries benutzten, nur nicht alle Funktionen davon. Generell darf alles verwendet werden, was keinen impliziten Kontext bzw die Laufzeitumgebung braucht und alles, was thread-safe ist. D.h. Divisionen/Multiplikationen dürfen auf jeden Fall verwendet werden, ebenso die str#? Funktionen.


ok, aber ich will ja, daß der Compiler ein einfaches

code:
float test = 1.2 / 0.3;


auch umsetzt ohne zu motzen das er Ieee-irgendwas nicht kennt. Und ich will ja auch nicht, daß wenn ich so eine linklib einbaue (z.B. die m881.lib) daß der sich dann über fehlende Referenzen beschwert - es soll halt fluppen...

--
:boing: Micha :boing:

http://www.Silicon-Wizards.com

[ - Antworten - Zitieren - Direktlink - ]

28.06.2006, 14:58 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von Micha1701:
ok, aber ich will ja, daß der Compiler ein einfaches
code:
float test = 1.2 / 0.3;

auch umsetzt ohne zu motzen das er Ieee-irgendwas nicht kennt. Und ich will ja auch nicht, daß wenn ich so eine linklib einbaue (z.B. die m881.lib) daß der sich dann über fehlende Referenzen beschwert - es soll halt fluppen...

Und das sollte ein compiler gefälligst auch können, und zwar ohne das Du eine zusätzliche Bibliothek benötigst. Je nach target-cpu muß der compiler vielleicht code generieren, der ein zusätzliche Bibliothek benötigt, aber das ist ja die Aufgabe des compilers. Aber dazu sollte man auch das frontend, in diesem Falle also vc, verwenden und nicht den linker (vlink) direkt.

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

[ - Antworten - Zitieren - Direktlink - ]

29.06.2006, 10:08 Uhr

Micha1701
Posts: 938
Nutzer
@Holger:

Ich verwende die CubicIDE und ich nehme mal an, daß die weiß wie man mit vbcc umgeht...

Ich hab jetzt die CPU auf 68020 gesetzt so funktionieren die 32Bit DIVs und MULs automatisch. Für die float Operationen verwende ich jetzt eben die Math.libraries. Ein bischen arbeit aber was solls...

--
:boing: Micha :boing:

http://www.Silicon-Wizards.com

[ - Antworten - Zitieren - Direktlink - ]

29.06.2006, 20:01 Uhr

gni
Posts: 1106
Nutzer
Zitat:
Micha1701:
Hier der Befehl zum kompilieren:
code:
vbcc:bin/vc -cpp-comments -D__NOLIBBASE__ -ICubic:workspace/bladelib2/include/C/ -nostdlib -o
 bin/vbcc-classic/blademp3.library o/vbcc-classic/mainfuncs.o o/vbcc-classic/libinit.o
 o/vbcc-classic/examplefuncs.o


Das ist das Linken, nur ohne Bibliotheken.
Zitat:
Also so wie ich das jetzt alles verstanden habe, ist es doch so, daß man in einer Library keine linkLib benutzen kann.
Falsch!
Zitat:
Also muß man wohl oder übel die Funktionen der math.libraries benutzen (z.B. MathIeeeSingBas.Library). OK, das ist übel, aber nun gut, da muß ich halt durch.
Käse.
Zitat:
Aber eine einfache Integer Division oder Multiplikation geht dann auch nicht mehr? Dafür muß ich dann tatsächlich die Utility.library benutzen (also SDivMod32() und SMul32())? Das ist heftig...
Die Laufzeitumgebung Deines Compilers erledigt viele Dinge für Dich, zb. das Öffnen von Bibliotheken. Das Du die utility.libray brauchst liegt am Prozessor, ebenso wie die Notwendigkeit der mathieee Bibliotheken.
Zitat:
Da macht Library erstellen erst so richtig Spaß, was...? :(
Wenn man es kann, ist eine shared Library nicht anders als ein "normales" Programm. Man muß halt die Einschränken kennen und auch seinen Compiler.

[ - Antworten - Zitieren - Direktlink - ]

30.06.2006, 06:49 Uhr

Micha1701
Posts: 938
Nutzer
@gni:

Also mit FALSCH und KÄSE als antworten kann ich leider nichts anfangen. Wäre nett, wenn Du mir sagst wie ich das denn machen muß, damit es so klappt wie Du meinst...
--
:boing: Micha :boing:

http://www.Silicon-Wizards.com

[ - Antworten - Zitieren - Direktlink - ]

30.06.2006, 10:43 Uhr

gni
Posts: 1106
Nutzer
Zitat:
Micha1701:
@gni:
Also mit FALSCH und KÄSE als antworten kann ich leider nichts anfangen. Wäre nett, wenn Du mir sagst wie ich das denn machen muß, damit es so klappt wie Du meinst...

tboeckel hat bereits geschrieben, das Linklibraries eines Compilers verwendet werden können und auch welche Funktionen vermutlich funktioneren.
Meine ersten beiden Kommentare habe ich so formuliert, weil ich bereits *vorher* geschrieben haben, das das was Du da wiederholt hast, nicht stimmt. Funktionen aus Linklibraries erwarten zum Teil eine bestimmte Umgebung, die bei einem normalen Programm automatisch existiert. Bei einer Library mußt Du die Rahmenbedingungen schaffen. Dafür gibt es keine festen Regeln. Du mußt die Fehlermeldungen analysieren und versuchen zu sehen, was genau "fehlt". Man kann auch ein "normales" Programm schreiben, das die problematischen Funktionen verwendet und dann da schauen, was man braucht. Wenn Du "nur" für den 68000 compilierst, dann funktioniert zb. 32bit Multiplikation/Division nicht ohne Library, da der 68000 das von Hause nicht unterstützt. Die Funktionen, die das dann machen können unterschiedlich implementiert sein, zb. per Funktionen aus der utility.library und die mußt dann *Du* bei der Initialisierung Deiner Library öffnen. Genau so verhält es sich bei Fließkomma-Arithmetik. Wenn Du nicht direkt die FPU verwendest (-fpu=), dann mußt Du die von Deiner Math-Linkbibliothek verwendeten Bibliotheken zur Verfügung stellen,sprich selber öffnen.
Das gößte Problem ist aber, wenn Funktionen der Linklibrary abort, exit oder vergleichbare Funktionen zum Programmabbruch aufrufen. Die kann man nur mit einem Stub ersetzen, der das Programm, das die shared Library benutzt, anhält. Das ist natürlich nicht besonders hilfreich noch nützlich. Gelegentlich kann man das Problem umgehen, in dem man bestimmte Funktionen "ersetzt".

[ - Antworten - Zitieren - Direktlink - ]

30.06.2006, 11:09 Uhr

Micha1701
Posts: 938
Nutzer
OK, das Problem mit den 32bit divs und muls hab ich umgangen, indem ich einfach die CPU auf 68020 gesetzt hab.

Aber für Fließkommazahlen muß ich doch z.B. die IEEE.lib nehmen. Die will aber neben DosBase (das wäre ja noch trivial) auch _stdin, _stdout, _stderr, _main und _malloc haben. Soll ich dann jetzt für malloc ne eigene Funktion schreiben? Und was will die Lib mit main()?

Ich hatte jetzt angefangen alle Fließkommaoperationen durch Funktionen der Math.libraries zu ersetzen, nur testen konnte ich bis jetzt nicht...
--
:boing: Micha :boing:

http://www.Silicon-Wizards.com

[ - Antworten - Zitieren - Direktlink - ]

30.06.2006, 12:45 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von Micha1701:
Aber für Fließkommazahlen muß ich doch z.B. die IEEE.lib nehmen. Die will aber neben DosBase (das wäre ja noch trivial) auch _stdin, _stdout, _stderr, _main und _malloc haben. Soll ich dann jetzt für malloc ne eigene Funktion schreiben? Und was will die Lib mit main()?


Also ich kann Dir nichts spezielles zu vbcc sagen, aber normalerweise sind die math-Bibliotheken, die man mittels -lm einbindet, und die compiler-support- Bibliotheken, die automatisch eingebunden werden, um von der CPU nicht unterstützte Funktionen wie Fließkomma-Arithmetik nachzubilden, zwei völlig verschiedene Dinge.

Normalerweise sind Link-Bibliotheken, wie der Name schon sagt, eine Sammlung von Objekten, von denen nur die an Dein Programm gebunden werden, die Du auch wirklich benutzt. Und einfache Rechenoperationen sollten keine Objekte referenzieren, die ihrerseits stdout oder malloc() benötigen.

Entweder Du benutzt derzeit den vbcc für diese Aufgabe auf die falsche Weise, oder dieser compiler funktioniert nicht wie ein normaler compiler. In beiden Fällen solltest Du Dir gut überlegen, ob Du jetzt ein Vielfaches an Arbeit auf Dich nehmen willst, statt das eigentliche Problem durch entweder die korrekte Befehlszeile oder einen anderen compiler zu beheben.

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

[ - Antworten - Zitieren - Direktlink - ]

18.07.2006, 10:39 Uhr

Micha1701
Posts: 938
Nutzer
Hi!

Hatte ganz vergessen Euch mitzuteilen, daß ich es nun hinbekommen habe das ganze für den 68881 zu kompilieren. Gibt nen tierischen Geschwindidgkeitsboost um den Faktor 5. Nicht schlecht...
--
:boing: Micha :boing:

http://www.Silicon-Wizards.com

[ - Antworten - Zitieren - Direktlink - ]


-1- [ - Beitrag schreiben - ]


amiga-news.de Forum > Programmierung > Fließkommazahlen in Library [ - Suche - Neue Beiträge - Registrieren - Login - ]


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