math.h 헤더를 포함 했는데도 왜 "sqrt에 대한 정의되지 않은 참조"오류가 발생합니까? [복제]
이 질문에 이미 답변이 있습니다.
- sqrt (또는 기타 수학 함수)에 대한 정의되지 않은 참조 5 답변
저는 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
'code' 카테고리의 다른 글
NSNotificationCenter와 동등한 Android (0) | 2020.09.04 |
---|---|
메인 스레드 검사기 : 백그라운드 스레드에서 호출 된 UI API :-[UIApplication applicationState] (0) | 2020.09.03 |
HQL 오류 : 결합에 필요한 경로 (0) | 2020.09.03 |
Heroku Postgres-중단 된 쿼리 종료 (트랜잭션 유휴) (0) | 2020.09.03 |
Type Dynamic은 어떻게 작동하며 어떻게 사용합니까? (0) | 2020.09.03 |