code

math.h 헤더를 포함 했는데도 왜 "sqrt에 대한 정의되지 않은 참조"오류가 발생합니까?

codestyles 2020. 9. 3. 19:21
반응형

math.h 헤더를 포함 했는데도 왜 "sqrt에 대한 정의되지 않은 참조"오류가 발생합니까? [복제]


이 질문에 이미 답변이 있습니다.

저는 C를 처음 접했고이 코드가 있습니다.

#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다른 삼각 함수 와 동일한 오류가 발생 합니다. 왜?


실행 파일을 빌드 할 때 수학 라이브러리를 연결해야합니다. 이를 수행하는 방법은 환경에 따라 다르지만 Linux / Unix에서는 -lm다음 명령을 추가 하기 만하면 됩니다.

gcc test.c -o test -lm

수학 라이브러리의 이름 libm.so은이고 -l명령 옵션은 lib접두사 및 .a/ 또는 .so접미사를 사용합니다.


-lm링커 옵션으로 를 연결해야합니다.

다음과 같이 컴파일해야합니다.

gcc test.c  -o test -lm

gcc (g ++ 아님)는 역사적으로 링크하는 동안 기본적으로 수학 함수를 포함하지 않았습니다. 또한 libc에서 별도의 라이브러리 libm으로 분리되었습니다. 이러한 기능을 링크하는 라이브러리 포함하도록 링커 조언 할 -l라이브러리 이름 다음 링커 옵션 m따라서를 -lm.


링커 오류 일 수 있습니다. -lm스위치를 추가하여 libm해당 함수에 대한 정의가 있는 표준 C 수학 라이브러리 ( ) 에 대해 링크하도록 지정합니다 (헤더에는 해당 함수에 대한 선언있습니다-차이점을 찾아 볼 가치가 있음).


링커에게 수학 라이브러리의 위치를 알려주지 않았기 때문 입니다. gcc test.c -o test -lm으로 컴파일


헤더 추가 :

#include<math.h>

참고 : abs ()를 사용하십시오. 때때로 평가시 sqrt ()는 음수 값을 사용하여 도메인 오류를 남길 수 있습니다.

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

예 : abs (-3) = 3

컴파일 시간 동안 명령 끝에 -lm을 포함합니다.

gcc <filename.extension> -lm

참고 URL : https://stackoverflow.com/questions/10409032/why-am-i-getting-undefined-reference-to-sqrt-error-even-though-i-include-math

반응형