ich habe ein banales Problem, haenge aber schon seit zwei Tagen drann
und kann es einfach nicht loesen...
Ich habe Suse Linux 6.3 auf meinem Notebook (HP Omnobook 4150)
installiert, aber anscheinend funktioniert unter dem gcc-Compiler das
einbinden der mathematischen Libraries nicht. Kurzes Beispiel, folgendes
Programm soll Compiliert werden:
/******************** prog.c
***************************************/
#include <stdio.h>
#include <math.h>
main()
{
double a, b, x, y;
a = 4.321 ;
b = 2.1234 ;
x = pow(a, b) ;
y = sqrt(b);
printf("\nx = %f\n", x) ;
}
/*************************************************************************/
Compiler und Linker werden mit folgendem Befehl in der shell (bash)
aufgerufen:
>> gcc -lm prog.c
Mit der Option -lm sollte ja eigentlich die mathematische Library libm.a
eingebunden werden, wo die Funktionen pow und sqrt definiert sein
sollten. Es kommt aber immer folgende Fehlermeldung:
> gcc -lm main.c
/tmp/cc69zKp9.o: In function `main':
/tmp/cc69zKp9.o(.text+0x52): undefined reference to `sqrt'
/tmp/cc69zKp9.o(.text+0x85): undefined reference to `pow'
collect2: ld returned 1 exit status
>
Ich habe schon alles moegliche ausprobiert, andere Libs besorgt und
unter /usr/local/lib abgespeichert, alle moeglichen Suchpfade
eingestellt (environment Variable LD_LIBRARY_PATH), hat alles nichts
geholfen, immer die gleiche Fehlermeldung. Auf anderen Maschinen (z.B.
SUN-Workstation) laeuft obiges Beispiel ohne Probleme, es muss also mit
der Installation von gcc + Libs auf meinen Notebook zusammenhaengen. Ich
habe Linux, mit allem drum und dran, aber ganz normal mit YaSt
installiert. Weis jemand, wo der Fehler liegt.
Dank, mit der Hoffnung auf Unterstuetzung
Ivancic
In de.comp.gnu Ivancic <blazenko...@dlr.de> wrote:
[...]
> Compiler und Linker werden mit folgendem Befehl in der shell (bash)
> aufgerufen:
>>> gcc -lm prog.c
Der wohl zweithaeufigste Anfaengerfehler im Zusammenhang mit
mathematischen Funktionen ueberhaupt. Du hast das '-lm' an die falsche
Stelle geschrieben. Das muss
gcc prog.c -lm
heissen. '-l<library>' ist als fast einzige Option von gcc
positionsabhaengig. Steht auch in der gcc Doku:
info gcc invoking link
erzaehlt dir mehr darueber.
--
Hans-Bernhard Broeker (bro...@physik.rwth-aachen.de)
Even if all the snow were burnt, ashes would remain.
> Compiler und Linker werden mit folgendem Befehl in der shell (bash)
> aufgerufen:
>>> gcc -lm prog.c
> Mit der Option -lm sollte ja eigentlich die mathematische Library libm.a
> eingebunden werden, wo die Funktionen pow und sqrt definiert sein
> sollten. Es kommt aber immer folgende Fehlermeldung:
>> gcc -lm main.c
> /tmp/cc69zKp9.o: In function `main':
> /tmp/cc69zKp9.o(.text+0x52): undefined reference to `sqrt'
> /tmp/cc69zKp9.o(.text+0x85): undefined reference to `pow'
> collect2: ld returned 1 exit status
> Ich habe schon alles moegliche ausprobiert, andere Libs besorgt und
> unter /usr/local/lib abgespeichert, alle moeglichen Suchpfade
> eingestellt (environment Variable LD_LIBRARY_PATH), hat alles nichts
> geholfen, immer die gleiche Fehlermeldung. Auf anderen Maschinen (z.B.
> SUN-Workstation) laeuft obiges Beispiel ohne Probleme, es muss also mit
> der Installation von gcc + Libs auf meinen Notebook zusammenhaengen. Ich
> habe Linux, mit allem drum und dran, aber ganz normal mit YaSt
> installiert. Weis jemand, wo der Fehler liegt.
Hab' Dein Programm in ein File prog.c gepastet. Dann:
| juergen@anna:~/prog/test > gcc -lm prog.c
| juergen@anna:~/prog/test > ./a.out
|
| x = 22.366582
| juergen@anna:~/prog/test > gcc -v
| Reading specs from /usr/lib/gcc-lib/i486-linux/egcs-2.91.66/specs
| gcc version egcs-2.91.66 19990314/Linux (egcs-1.1.2 release)
| juergen@anna:~/prog/test > ld -v
| GNU ld version 2.9.1 (with BFD 2.9.1.0.25)
| juergen@anna:~/prog/test > ldd a.out
| libm.so.6 => /lib/libm.so.6 (0x4001e000)
| libc.so.6 => /lib/libc.so.6 (0x4003b000)
| /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
Hmm, vergleiche doch mal die Versionen von gcc und ld. Per Default
versucht der Linker übrigens gegen die dynamischen Libraries (falls
vorhanden) zu linken. Wenn Du also eine statische libm.a erneuert hast,
dann kann es sein, dass diese gar nicht verwendet wird. In diesem Fall
musst Du "gcc -static -lm ..." verwenden.
Beste Grüsse - Jürgen.
--
Einstein also said: "God does not gamble." thereby denying the
existence of true stochastic processes. So, he clearly did not know
everything, but does that make him stupid? (P.-H. van der Giessen)
--------------------------------------------------------------
Hat leider immer noch alles nichts gebracht. Meine versionen von gcc und ld
stimmen
mit den oben genannten aber exakt ueberein. Ich befuerchte meine
mathematische
Library libm.a hat ne Macke. Die libm.a die ich von der SUN auf das Linux
System kopiert
habe wird auch nicht akzeptiert (Format kann nicht gelesen werden). Bringt es
etwas die libm.a
neu zu installieren (darf man so etwas ueberhaupt oder muss man die ganze
Development Serie
von Suse frisch installieren).
Eine andere Idee ist auch den Linker von der SUN (also nur das binary) auf
das Linux System zu
installieren, dann muesste doch auch die "SUN libm.a" gelesen werden koennen.
Oder ist das totaler
Mist was ich da vorhabe.
Viele Gruesse, Ivancic
> Hat leider immer noch alles nichts gebracht. Meine versionen von gcc
> und ld stimmen mit den oben genannten aber exakt ueberein. Ich
> befuerchte meine mathematische Library libm.a hat ne Macke. Die
> libm.a die ich von der SUN auf das Linux System kopiert habe wird
> auch nicht akzeptiert (Format kann nicht gelesen werden).
Bist du dir der Tatsache bewusst, dass verschiedene Prozessoren
verschiedene Befehle haben, und dass ein SPARC-Programm nicht ohne
weiteres auf einem Intel-Prozessor läuft?
Ferner wird auch ein Solaris/i386-Binary nicht ohne weiteres auf einem
Linux/i386-System laufen, da das Solaris-Binary Funktionen aus
verschiedenen Libraries aufruft, die unter Linux möglicherweise ganz
anders funktionieren. Ferner wird das Solaris-Binary sogenannte
System-Calls machen (Funktionen aus dem Kernel aufrufen), die es im
Linux-Kernel so nicht gibt.
Wenn das alles ginge, könntest du ja auch einfach so ein
Windows-Programm unter Linux laufen lassen -- ist ja immerhin beides
i386.
kai
--
~/.signature: No such file or directory
> Hat leider immer noch alles nichts gebracht. Meine versionen von gcc und ld
> stimmen
> mit den oben genannten aber exakt ueberein. Ich befuerchte meine
> mathematische
> Library libm.a hat ne Macke. Die libm.a die ich von der SUN auf das Linux
> System kopiert
> habe wird auch nicht akzeptiert (Format kann nicht gelesen werden).
No SUN-lib auf ein anderes Unix zu kopieren ist auch nicht gerade die beste
Idee...
> Bringt es etwas die libm.a
> neu zu installieren (darf man so etwas ueberhaupt oder muss man die ganze
> Development Serie
> von Suse frisch installieren).
Du hast ein Problem mit Deinem Setup, wuerde ich sagen. Bei mir funktioniert
Dein Beispiel problemlos.
Du kannst durchaus die libm.a (hast Du keine libm.so??) installieren,
solange es eine von Linux ist. Um sicher zu gehen, dass Du Dein System
hinkriegst, wuerde ich persoenlich zu einer Neuinstallation des Compilers
and evtl. auch noch der libm.so raten.
> Eine andere Idee ist auch den Linker von der SUN (also nur das binary) auf
> das Linux System zu
> installieren, dann muesste doch auch die "SUN libm.a" gelesen werden koennen.
> Oder ist das totaler
Das wuerde das gleiche wie mit der Library: Kann nicht gelesen/ausgefuehrt
werden.
cu,
Knut
--
Ninety-Nienty Rule of Project Schedules:
The first ninety percent of the task take ninety percent of
the time, and the last ten percent take the other ninety percent.
> Du kannst durchaus die libm.a (hast Du keine libm.so??) installieren,
> solange es eine von Linux ist. Um sicher zu gehen, dass Du Dein System
Und auf den Prozessor passt. Mein i486 wird mir was husten, wenn ich
eine libm.{a,so} von einem Power-PC-Linux einspiele... Wenn jemand
Bibliotheken von Suns kopiert, ist ihm auch das zuzutrauen.
SCNR,
Michael Karcher
In article <38BE1FC0...@dlr.de> of de.comp.gnu,
Ivancic <blazenko...@dlr.de> wrote:
> mathematische Library libm.a hat ne Macke. Die libm.a die ich von
> der SUN auf das Linux System kopiert habe wird auch nicht
> akzeptiert (Format kann nicht gelesen werden).
Autsch. (S. andere Postings.)
> Bringt es etwas die libm.a neu zu installieren (darf man so etwas
> ueberhaupt oder muss man die ganze Development Serie von Suse
> frisch installieren).
Im welchem Paket ist die libm.a?
# rpm -qf /usr/lib/libm.a
Dieses Paket verifizieren:
# rpm -Vvv $(rpm -qf /usr/lib/libm.a)
Das sagt Dir, welche Dateien sich verändert haben. (Eine kleine
Tabelle am Anfang der Zeilen sagt Dir, _was_ sich geändert hat -
Aufschlüsselung siehe "man rpm".)
Wenn die libm.a "kaputt" ist, musst Du irgendwas machen wie
# rpm -Fvh --replacepackages /cdrom/SuSE/???/paketname.rpm
Konsultiere dazu Deine nächste Linux-Newsgroup. ;-)
HTH,
Moritz.
--
All opinions expressed above are my own and not approved by my employer.