Forum: PC-Programmierung gcc - Problem mit Ubuntu


von R. M. (n_a_n)


Angehängte Dateien:

Lesenswert?

Hallo Forumisten, vielleicht kann mir jemand bei folgendem Problem 
helfen:
Ich habe einen neuen PC mit Ubuntu gekauft.

-Version-
Kernel    : Linux 5.3.0-53-generic (x86_64)
Version    : #47~18.04.1-Ubuntu SMP Thu May 7 13:10:50 UTC 2020
C-Library    : GNU C Library / (Ubuntu GLIBC 2.27-3ubuntu1) 2.27
Distribution    : Ubuntu 18.04.4 LTS

Auf meinem alten PC habe ich mehrere Programme erstellt, und die möchte 
ich nun portieren. Dabei tritt bei einigen Programmen beim Compilieren 
ein Fehler auf,
die meisten lassen sich problemlos neu übersetzen.

Ein Fehlerbeispiel:
1
reinhard@reinhard-TUXEDO:~/Schreibtisch/myC/BiquadFilterExamples$ gcc -lm -o BQ BQ.c
2
/tmp/ccg357OV.o: In Funktion »main«:
3
BQ.c:(.text+0x32d): Warnung: undefinierter Verweis auf »cexp«
4
BQ.c:(.text+0x509): Warnung: undefinierter Verweis auf »cabs«
5
BQ.c:(.text+0x55c): Warnung: undefinierter Verweis auf »atan2«
6
/tmp/ccg357OV.o: In Funktion »calcBiquad«:
7
BQ.c:(.text+0x7ab): Warnung: undefinierter Verweis auf »pow«
8
BQ.c:(.text+0x7ca): Warnung: undefinierter Verweis auf »tan«
9
BQ.c:(.text+0xe07): Warnung: undefinierter Verweis auf »sqrt«
10
BQ.c:(.text+0xe72): Warnung: undefinierter Verweis auf »sqrt«
11
BQ.c:(.text+0xf15): Warnung: undefinierter Verweis auf »sqrt«
12
BQ.c:(.text+0x101f): Warnung: undefinierter Verweis auf »sqrt«
13
BQ.c:(.text+0x10b6): Warnung: undefinierter Verweis auf »sqrt«
14
/tmp/ccg357OV.o:BQ.c:(.text+0x110d): Warnung: weitere undefinierte Verweise auf »sqrt« folgen
15
collect2: error: ld returned 1 exit status
Auf meinem alten System lies sich das problemlos so übersetzen.
Es hat etwas mit dem linken mit der libm zu tun(?)
Muss ich bei einem 64bit System eine andere lib verwenden und wenn ja 
welche?
Ich weis es einfach nicht und bin für jede Hilfe dankbar.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

R. M. schrieb:
> Es hat etwas mit dem linken mit der libm zu tun(?)

Ja.

> Muss ich bei einem 64bit System eine andere lib verwenden und wenn ja
> welche?

Nein.

Es hat was damit zu tun, dass du die Idee hinter dem Linken von 
Bibliotheken nicht verstanden hast: diese werden vom Linker zur 
Auflösung undefinierter externer Referenzen benutzt - aber diese müssen 
an der Stelle, wo die Bibliothek "abgearbeitet" wird, auch bereits 
vorliegen.

In deinem Falle hast du die Bibliothek als erstes auf der Kommandozeile 
angegeben. Zu diesem Zeitpunkt ist noch keine einzige Referenz 
undefiniert, daher wird aus dieser Bibliothek nichts entnommen.

Schreib das -lm einfach mal ans Ende der Kommandozeile.

ps: Und: -O (oder -O2 oder sowas) ist Pflicht. Default ist -O0, das 
willst du nicht haben.

: Bearbeitet durch Moderator
von leo (Gast)


Lesenswert?


von R. M. (n_a_n)


Lesenswert?

Danke, das war es.
(Wobei ich mir fast sicher bin, das es bei meinem alten System auch mit 
dieser Reihenfolge geklappt hat) -- aber egal.
Danke nochmal.
Reinhard

von R. M. (n_a_n)


Lesenswert?

@leo
danke für den Link
------------------------------------------------------------------------ 
------
 confirm the unexpected link-order behaviour that you observe with gcc 
5.1 and also that I have the traditional behaviour with gcc 4.9.2. I 
would infer that this novelty comes in with gcc 5.x, and that your 
toolchain is gcc 5.x. Possibly it is a distro-specific anomaly of the 
toolchain build. My toolchain is as per ubuntu 14.04.
------------------------------------------------------------------------ 
-------

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

R. M. schrieb:
> Wobei ich mir fast sicher bin, das es bei meinem alten System auch mit
> dieser Reihenfolge geklappt hat

Naja, bei dynamischem Linken sind die Leute schlampig geworden.

Wenn man statisch linkt, war die Reihenfolge schon immer entscheidend, 
daher sollte man es sich auch grundsätzlich so angewöhnen.

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
Noch kein Account? Hier anmelden.