sourcecode

math.h 헤더를 포함했는데도 "undefined reference to sqrt" 오류가 발생하는 이유는 무엇입니까?

copyscript 2022. 7. 23. 13:53
반응형

math.h 헤더를 포함했는데도 "undefined reference to 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으로 분리되었습니다.이러한 기능과 링크하려면 링크커에게 라이브러리를 포함하도록 조언해야 합니다.-llinker 옵션 뒤에 라이브러리 이름이 표시됩니다.m따라서-lm.

헤더 추가:

#include<math.h>

주의: abs()를 사용합니다.평가 시 sqrt()가 음수 값을 취할 수 있으며 도메인 오류가 발생할 수 있습니다.

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

예, abs(복근)3) = 3

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

gcc <filename.extension> -lm

이것은 링커 에러일 가능성이 있습니다.를 추가합니다.-lm표준 C 연산 라이브러리에 대해 링크할 것을 지정하도록 스위치를 선택합니다(libm이러한 함수에 대한 정의를 가지고 있습니다(헤더에는 선언이 포함되어 있기 때문에 차이를 조사할 가치가 있습니다).

왜냐하면 너는 링커에게 수학 도서관의 위치를 알려주지 않았으니까.gcc test.c -o test -lm을 사용하여 컴파일합니다.

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

반응형