2012-05-02 2 views
62

나는 C 아주 새로운 그리고 난이 코드가 있습니다math.h 헤더를 포함해도 "sqrt에 대한 정의되지 않은 참조"오류가 발생하는 이유는 무엇입니까?

#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; 
} 

을하지만 이것을 컴파일 할 때 :

gcc test.c -o test 

나는 다음과 같은 오류가 발생합니다 :

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

왜 이런 일이 생길까요? sqrt()math.h 헤더 파일에 없습니까? 내가 cosh 및 기타 삼각 함수와 같은 오류가 발생합니다. 왜?

+1

그리고 왜 여기에'libm'이 표준 라이브러리의 일부를 포함하고 있지만 왜 왜 링크되어 있지 않은지에 대한 추측이 있습니다 : http://stackoverflow.com/questions/1033898/why-do-you-have- to-link-the-math-library-in-c –

+0

이 라이브러리는 다음과 같습니다. http://stackoverflow.com/q/5248919/694576 – alk

답변

102

실행 파일을 빌드 할 때 수학 라이브러리가 링크되어 있어야합니다. 이 환경에 따라 다르지만 리눅스/유닉스에서, 단지 명령에 -lm를 추가하는 방법 :

gcc test.c -o test -lm 

수학 라이브러리가 libm.so 이름과 -l 명령 옵션은 lib 접두사와 .a 또는 .so 접미사를 가정한다.

17

당신은 연결하면서 역사적 기본적으로 수학 함수를 포함하지 않을 당신은

gcc test.c -o test -lm 

GCC (안 g ++)로 컴파일하는 데 필요한 -lm 링커 옵션

로를 연결해야합니다. 또한 libc에서 별도의 라이브러리 libm으로 분리되었습니다. 이러한 함수를 링크하려면 링커에 라이브러리 -l 링커 옵션을 포함하고 라이브러리 이름 뒤에 m을 포함하도록 조언해야합니다. -lm.

7

이것은 링커 오류 일 가능성이 큽니다. 는 당신이 그 기능에 대한 정의가 표준 C 수학 라이브러리 (libm)에 연결하도록 지정 -lm 스위치를 추가 (헤더 단지 그들을 위해 선언있다 -. 차이를 찾는 가치)

4

수학 라이브러리에 대한 링커에게 말하지 않았기 때문에. 추가 GCC의 TEST.C -o 테스트 -lm

1

로 컴파일 헤더 :

#include<math.h>

참고 : 때때로 평가 SQRT()시 사용 복근(), 음의 값을 가질 수있는 도메인 오류로 남겨 두십시오.

abs() - 절대 값을 제공합니다.

예를 들어, ABS (-3) = 3

컴파일 시간 동안 명령의 끝에 -lm 포함 :

gcc <filename.extension> -lm

3

당신은 당신의 코드와 헤더 파일 math.h을 연결해야합니다.명령 뒤에 -lm을 입력하면됩니다.