2012-05-02 18 views
62

Jestem bardzo nowe do C i mam ten kod:Dlaczego pojawia się błąd "niezdefiniowane odniesienie do sqrt", mimo że dołączam nagłówek math.h?

#include <stdio.h> 
#include <math.h> 
int main(void) 
{ 
    double x = 0.5; 
    double result = sqrt(x); 
    printf("The square root of %lf is %lf\n", x, result); 
    return 0; 
} 

Ale kiedy mogę skompilować to z:

gcc test.c -o test 

pojawia się błąd jak poniżej:

/tmp/cc58XvyX.o: In function `main': 
test.c:(.text+0x2f): undefined reference to `sqrt' 
collect2: ld returned 1 exit status 

Dlaczego to się dzieje? Czy plik sqrt() nie znajduje się w pliku nagłówkowym sqrt()? Ten sam błąd występuje z cosh i innymi funkcjami trygonometrycznymi. Czemu?

+1

A oto kilka spekulacji o tym, dlaczego 'libm' nie jest domyślnie połączony, mimo że zawiera część standardowej biblioteki: http://stackoverflow.com/questions/1033898/why-do-you-have- to-link-the-math-library-in-c –

+0

Jest to duplikat tego: http://stackoverflow.com/q/5248919/694576 – alk

Odpowiedz

102

Biblioteka matematyki musi być połączona podczas budowania pliku wykonywalnego. Jak to zrobić, zależy od środowiska, ale w Linux/Unix, wystarczy dodać -lm z poleceniem:

gcc test.c -o test -lm 

Biblioteka matematyki nazywa libm.so i opcja komenda -l zakłada lib prefiks i .a lub .so przyrostek.

17

trzeba połączyć z opcją -lm łącznikowej

musisz skompilować jako

gcc test.c -o test -lm 

gcc (nie g ++) historycznie nie będzie domyślnie obejmuje funkcje matematyczne, natomiast powiązanie. Został również oddzielony od biblioteki libc na oddzielnej bibliotece libm. Aby połączyć się z tymi funkcjami, musisz doradzić linkerowi, aby dołączyć opcję łączenia biblioteki -l, a następnie nazwę biblioteki m, czyli -lm.

7

Jest to prawdopodobnie błąd łącznika. Dodaj przełącznik -lm aby określić, że chcesz się połączyć przeciwko biblioteki standardowe C matematyki (libm), które ma definicję tych funkcji (nagłówek ma tylko deklarację dla nich. - warto przyjrzeć się różnicy)

4

Ponieważ nie powiedziałeś linkerowi o lokalizacji biblioteki matematyki. Skompilować z gcc -o test.c testu -lm

1

Dodaj nagłówek:

#include<math.h>

Uwaga: stosowanie abs(), czasami w momencie oceny sqrt() może przyjmować wartości ujemne, które pozostawić błąd domeny.

abs() - podaje wartości bezwzględne;

przykład, abs (-3) = 3

Dołącz -lm na końcu polecenia w czasie kompilacji:

gcc <filename.extension> -lm

3

Musisz połączyć plik nagłówka math.h z kodem.Możesz to zrobić, wpisując po swoim poleceniu -lm.

Powiązane problemy