2011-04-19 5 views
1

왜 다음 코드가 오류 을 sqrt에 정의되지 않은 참조로 보내고 있습니다.C에서 math.sqrt 문제가 발생했습니다

#include <stdio.h> 
#include <stdlib.h> 
#include <math.h> 

int main(void) 
{ 
    double i = 25; 
    printf("\nSquare root of %d = %d",i,sqrt(i)); 
    return 0; 
} 

나는 math.h을 포함하고 난 사람이 잘못 수도 있었죠가는 내가 다시 또는 뭔가 내 라이브러리를 설치할 필요가 있는지 말해 Debian.Can 사용하고?

+0

완전하고 정확한 오류 메시지를 포함하십시오. 컴파일러 또는 링커 문제인지 여부를 나타내는 데 도움이됩니다. 또한 math.h를 열고 sqrt가 거기에 있는지 스스로 확인하십시오. – abelenky

+2

-lm을 사용 했습니까? – Reno

+2

변경자를 변경하십시오 - sqrt는 double을 리턴하고, 둘 다에 대해 수정자를 사용했습니다. – Bakudan

답변

2

GCC를 사용하고 있습니까? "정의되지 않은 참조"는 연결 오류가 있음을 의미합니다. 즉, 불만을 제기하는 기능이 포함 된 라이브러리에 제대로 연결되어 있지 않습니다. 이 경우 링커 플래그에 -lm을 추가하여 수학 라이브러리에 연결할 수 있다고 생각합니다.

7

수학 라이브러리에 링크하려면 명령 행에서 -lm 플래그로 컴파일하십시오.

3

수학 함수는 Linux에서 기본적으로 연결되지 않습니다 (비교적 드물게 사용되기 때문에). 컴파일러 줄에

-lm 

을 추가하여 수학 라이브러리 libm.so에 링크해야합니다.

+0

은 기술에 정통한 사람들을위한 Linux가 아닙니다. 그렇다면 수학 라이브러리는 거의 사용되지 않고 필수적이어야합니까? –

+0

수학 라이브러리가 기본적으로 연결되어 있지 않은 이유는 함수가 거의 사용되지 않는다는 것이 아닙니다. 실제로 libc의 다른 많은 부분보다 빈번하게 사용됩니다. 실제 이유는이 시점에서 대부분 역사적인 호기심입니다. 근본적으로, 사용자는 역사적으로 libc의 다른 부분보다 수학 라이브러리의 다른 구현을 사용하고자 할 가능성이 더 큽니다. –

+0

@Stephen Canon : sqrt(), sin() 및 log()는 malloc(), printf() 또는 memcpy()보다 자주 사용됩니까? 나는 그렇게 생각하지 않는다. 그러나 당신이 옳다. 대안 구현을 사용할 수있는 능력은 수학 함수가 libc와 함께 일괄 처리되지 않는 또 다른 이유입니다. (특히 처음에는 모든 컴퓨터가 FPU를 가지고 있지 않았고 에뮬레이션 라이브러리의 성능이나 정밀도가 크게 달랐습니다.) 이것은 언어 표준에서 요구하는 것이 아니라 Unix의 구현 세부 사항에 유의하십시오. – DevSolar

관련 문제