staging.inyokaproject.org

C programmieren: Nicht definierter Verweis auf 'sqrt'

Status: Gelöst | Ubuntu-Version: Xubuntu 16.10 (Yakkety Yak)
Antworten |

GideonRavenor

Anmeldungsdatum:
1. März 2015

Beiträge: Zähle...

1
2
3
4
5
6
7
8
9
#include <math.h>

int main(void)
{
	float a = 5;
	a = sqrt(a);
	
	return 0;
}
gcc test.c
/tmp/ccy2wOvS.o: In Funktion `main':
test.c:(.text+0x1b): Nicht definierter Verweis auf `sqrt'
collect2: error: ld returned 1 exit status

gcc manuell ausführen zeigt, dass das Problem am Linker liegt:

gcc -c test.c
gcc -o test.out test.o
/tmp/ccy2wOvS.o: In Funktion `main':
test.c:(.text+0x1b): Nicht definierter Verweis auf `sqrt'
collect2: error: ld returned 1 exit status

Was ist denn da los? Ich habe schon nachgeschaut, in /usr/include ist die math.h genauso vorhanden wie stdio.h usw. usw.

frostschutz

Avatar von frostschutz

Anmeldungsdatum:
18. November 2010

Beiträge: 7795

SQRT(3)                    Linux Programmer's Manual                   SQRT(3)



NAME
       sqrt, sqrtf, sqrtl - square root function

SYNOPSIS
       #include <math.h>

       double sqrt(double x);
       float sqrtf(float x);
       long double sqrtl(long double x);

       Link with -lm.

GideonRavenor

(Themenstarter)

Anmeldungsdatum:
1. März 2015

Beiträge: Zähle...

Was bedeutet das? Wenn Ich's mit -lm ausführe kommt die gleiche Fehlermeldung.

frostschutz

Avatar von frostschutz

Anmeldungsdatum:
18. November 2010

Beiträge: 7795

Bei mir tut das dann so...

$ gcc test.c
/tmp/ccbOJzBI.o: In function `main':
test.c:(.text+0x1b): undefined reference to `sqrt'
collect2: error: ld returned 1 exit status
$ gcc test.c -lm

Die Fehlermeldung sagt ja daß es von ld kommt, also Linkerprobleme. Die Compiler sind auch 2016 nicht schlau genug das automagisch zu machen 😉

GideonRavenor

(Themenstarter)

Anmeldungsdatum:
1. März 2015

Beiträge: 171

Hmm, ok, geht, danke.

Das ist ja nervig, jetzt muss Ich für jede Funktion, die mal nicht funktioniert, von Hand nachsehen wie sie gelinkt werden will.

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17630

GideonRavenor schrieb:

Hmm, ok, geht, danke.

Das ist ja nervig, jetzt muss Ich für jede Funktion, die mal nicht funktioniert, von Hand nachsehen wie sie gelinkt werden will.

Nervig wäre aber auch, wenn der Linker immer alle Bibliotheken durchsuchen würde auf der Suche nach einer Funktion, zumal es dann eine Konvention geben müsste, welche Funktion verwendet wird, sofern eine Namenskollision auftritt.

Bei Funktionen, die man oft verwendet, lernt man schnell und automatisch, wo sie sind und wie sie heißen. Bei solchen, die exotisch sind, weiß man gleich, dass sie exotisch sind und musste sie wohl für das Projekt sowieso suchen.

Antworten |