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으로 분리되었습니다.이러한 기능과 링크하려면 링크커에게 라이브러리를 포함하도록 조언해야 합니다.-l
linker 옵션 뒤에 라이브러리 이름이 표시됩니다.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
'sourcecode' 카테고리의 다른 글
C에 왼쪽이 없을 때 & 오퍼레이터는 어떻게 해야 합니까? (0) | 2022.07.23 |
---|---|
Linux에서 비동기 신호 핸들러는 어떻게 실행됩니까? (0) | 2022.07.23 |
복사된 데이터가 변경될 때 Vuex 상태를 변경하지 않고 Vuex 상태에서 Data로 값을 복사하려면 어떻게 해야 합니까? (0) | 2022.07.17 |
특정 gcc 컴파일러의 glibc 버전을 확인합니다. (0) | 2022.07.17 |
.$mount()와 el의 차이 [Vue JS] (0) | 2022.07.17 |