Hi, ich habe ein Problem mit dem integrierten Compiler GCC in AVRStudio mit SP2. In meiner Funktion gibt es eine Zeile mit Log10: logEx=0.66077+7.5*t/(237.3+t)+(log10(h)-2); In AVR Studio wird dies angemeckert: ../megaSHT.c:285: undefined reference to `log10' mit einem externen Makefile geht es aber ohne Probleme. Das gleiche hab ich auch noch mit: dtostrf(dew_point,3,1,buf); megaeib.o(.text+0xdc6):../megaeib.c:373: undefined reference to `dtostrf' Was mach ich da falsch? Gruss Patrick
Hallo, hab ich bei den Custom Options dazugepackt, geht leider immer noch nicht. Ich bekomme die gleiche Fehlermeldung? Gruss patrick
Denk dran, dass die Bibliotheken beim Linken am Ende (nach den .o-Dateien) stehen müssen. "custom options" klingt mir wie options beim Compilieren, da wird sie nicht gebraucht. Mach doch mal 'n Bugreport in Trondheim auf, damit -lm standard- mäßig mit in die Linkeroptionen aufgenommen wird. Es schadet nichts, wenn es drin ist und nicht gebraucht wird.
Diesbezüglich könnte man* sich übrigens etwas von Microsoft abgucken, was wohl ganz praktisch ist: Ein #pragma comment(lib, "bla") im Quelltext (also auch in einer Headerdatei) sorgt dafür, daß der Linker automatisch mit der Library bla.lib (MS-äquivalent von .a) linkt. Hier böte es sich an, in den Headerdateien, die Funktionen wie log10 deklarieren, ebenjenes #pragma unterzubringen. *) "man" bezieht sich auf die Leute, die gcc pflegen und weiterentwickeln
GCC benutzt ohnehin keine Pragmas (außer den vom Standard vorgeschriebenen), und meines Wissens gibt's das vorhandene Objektformat auch gar nicht her, dass man diese Information an den Linker weiterreichen könnte. Aber: was ich für die avr-libc auf Dauer vorhabe ist, die libm.a komplett fallen zu lassen und alles in die libc.a zu integrieren. (Eine leere libm.a werden wir trotzdem mitliefern, damit alle diejenigen, die aus Gewohnheit -lm drin stehen haben, nicht auf die Nase fallen.)
Also, ich verstehe nur Bahnhof.. ich wollte das neue AVR Studio verwenden in dem der GCC schon eingebaut wird. Dabei gibt es im Menüe einen Knopf in dem man die Optionen einstellen kann. Darin gibt es auch die Custom Option. Seltsam ist meine Deklaration der Lib's: #include <avr/io.h> #include <avr/interrupt.h> #include <avr/signal.h> #include <inttypes.h> #include <avr/iom128.h> #include <inttypes.h> #include <avr/delay.h> #include <stdio.h> #include <math.h> #include <compat/ina90.h> dabei ist ja die Log10 Funktion in der math.h. kommentiere ich die aus: //#include <math.h> erscheint die gleiche Fehlermeldung, so als ob der Compiler die Lib nicht verwendet? Gruss Patrick
Hallo, hab im Anhang mal den Code gepackt in dem die Log10 Funktion drin ist.. vieleicht kann mir jemand helfen? Gruss Patrick
@Patrick: Du verwechselst Headerdateien und Libraries. Die Headerdatei math.h enthält nur Deklarationen (Funktionsprototypen), damit der Compiler Funktionsaufrufe korrekt übersetzen kann. Da steht gewissermaßen nur drin, daß es eine Funktion namens log10 gibt, welchen Typ ihre Argumente und Rückgabewert haben, aber nicht deren Implementierung (der Code, der tatsächlich rechnet). Das kannst Du Dir auch ansehen, Headerdateien sind ganz normale Textdateien. Der Compiler erzeugt aus Deiner Quelltextdatei eine Objektdatei, in der wiederum (in binärer Form) eine Tabelle von externen Symbolen aufgeführt ist. Das sind all die Funktionen, von denen dem Compiler mitgeteilt wurde (oder von denen er es unter Ausgabe von Warnungen selbst angenommen hat), daß sie irgendwo anders existieren. log10 ist so ein Kandidat. Erst der Linker "verheiratet" Deine erzeugte Objektdatei mit dem Code der Implementierung der Funktion log10 - und die ist in einer Library namens libm.a enthalten. Gcc-spezifisch ist diese Namensgebung von Libraries - ihr Name fängt immer mit "lib" an und ihre Extension ist .a. Bei der Angabe der zu verwendenden Libraries (mit -l) wird im Makefile das "lib" weggelassen. So wird aus libm.a ein einfaches "m" und also lautet die Dir fehlende Option "-lm". Wird's jetzt allmählich klarer?
Habe mir eben mal ein AVR Studio ,,geborgt''. Ist doch ganz einfach: in den Projekteigenschaften gibt's links so ein Kindergartenbildchen, unterschrieben mit "Libraries". Darin steht unter "Available libraries" u. a. eine libm.a. Die wählst du bitte aus.
Danke für den Tipp, nach dem Einbinden der Lib geht es. zumindest übersetzt AVR Studio nun das Programm, laufen tut es aber immer noch nicht. hab eine Schleife im Programm: while (!bAckFlag) { ; //wait.. } diese klappt aber nicht wenn ich in AVRStudio übersetzte, mein Programm bleibt dabei immer hängen. Mit einem externen Makefile geht es? Gruss Patrick
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.