`sin`에 대한 정의되지 않은 참조
이 질문에 이미 답변이 있습니다.
- sqrt (또는 기타 수학 함수)에 대한 정의되지 않은 참조 5 답변
다음 코드가 있습니다 (이 질문에 대한 기본 사항으로 요약).
#include<stdio.h>
#include<math.h>
double f1(double x)
{
double res = sin(x);
return 0;
}
/* The main function */
int main(void)
{
return 0;
}
컴파일 할 때 gcc test.c
다음과 같은 오류가 발생하고 이유를 알 수 없습니다.
/tmp/ccOF5bis.o: In function `f1':
test2.c:(.text+0x13): undefined reference to `sin'
collect2: ld returned 1 exit status
그러나 함수 sin
내에서 호출하는 다양한 테스트 프로그램을 작성 했으며 main
완벽하게 작동합니다. 분명히 여기서 뭔가 잘못하고있는 게 분명합니다.하지만 그게 뭔데요?
올바른 math.h 헤더 파일에 대한 참조를 사용하여 코드를 컴파일했지만 링크를 시도 할 때 수학 라이브러리를 포함하는 옵션을 잊어 버렸습니다. 결과적으로 .o 개체 파일을 컴파일 할 수 있지만 실행 파일을 빌드 할 수는 없습니다.
Paul이 이미 언급했듯이 -lm
실행 파일 생성을 시도하는 단계에서 수학 라이브러리와 연결하기 위해 " "를 추가 합니다.
왜
sin()
in에서 명시 적으로 옵션이<math.h>
필요합니까-lm
? 하지만,하지 않는printf()
에서<stdio.h>
?
이 두 기능은 "단일 UNIX 사양"의 일부로 구현되기 때문입니다. 이 표준의 역사는 흥미롭고 많은 이름으로 알려져 있습니다 (IEEE Std 1003.1, X / Open Portability Guide, POSIX, Spec 1170).
이 표준은 특히 "표준 C 라이브러리"루틴을 "표준 C 수학 라이브러리"루틴 (페이지 275)에서 분리 합니다. 관련 구절은 아래에 복사됩니다.
표준 C 라이브러리
표준 C 라이브러리는
cc
외부 참조를 해결하기 위해 자동으로 검색됩니다 . 이 라이브러리는 수학 루틴을 제외하고 볼륨 1에 정의 된대로 기본 시스템의 모든 인터페이스를 지원합니다.표준 C 수학 라이브러리
이 라이브러리는 볼륨 1에 정의 된 기본 시스템 수학 루틴을 지원합니다.
cc
옵션-lm
은이 라이브러리를 검색하는 데 사용됩니다.
이 분리의 이유는 다음과 같은 여러 요인의 영향을 받았습니다.
- UNIX 전쟁은 원래 AT & T UNIX 제공에서 발산 증가되었다.
- UNIX 플랫폼의 수는 운영 체제 용 소프트웨어 개발에 어려움을 더했습니다.
- 소프트웨어 개발자를위한 최저 공통 분모를 정의하려는 시도 인 1988 POSIX 가 시작되었습니다 .
- 더 많은 플랫폼에 도달하기 위해 "POSIX 호환 시스템"에서 소프트웨어를 제공하도록 POSIX 표준에 따라 프로그래밍 된 소프트웨어 개발자.
- UNIX 고객은 소프트웨어를 실행하기 위해 "POSIX 호환"UNIX 시스템을 요구했습니다.
-lm
다른 라이브러리 에 배치하기로 결정한 압력은 다음 과 같지만 이에 국한되지는 않습니다.
- 많은 응용 프로그램이 수학 라이브러리에 포함 된 함수를 사용하지 않기 때문에 libc의 크기를 줄이는 좋은 방법 인 것 같습니다.
- 일부 수학 라이브러리는 더 큰 임베디드 조회 테이블에 의존하고 다른 일부는 더 작은 조회 테이블 (컴퓨팅 솔루션)에 의존 할 수있는 수학 라이브러리 구현에 유연성을 제공합니다.
- For truly size constrained applications, it permits reimplementations of the math library in a non-standard way (like pulling out just
sin()
and putting it in a custom built library.
In any case, it is now part of the standard to not be automatically included as part of the C language, and that's why you must add -lm
.
I have the problem anyway with -lm added
gcc -Wall -lm mtest.c -o mtest.o
mtest.c: In function 'f1':
mtest.c:6:12: warning: unused variable 'res' [-Wunused-variable]
/tmp/cc925Nmf.o: In function `f1':
mtest.c:(.text+0x19): undefined reference to `sin'
collect2: ld returned 1 exit status
I discovered recently that it does not work if you first specify -lm. The order matters:
gcc mtest.c -o mtest.o -lm
Just link without problems
So you must specify the libraries after.
You need to link with the math library, libm:
$ gcc -Wall foo.c -o foo -lm
I had the same problem, which went away after I listed my library last: gcc prog.c -lm
참고URL : https://stackoverflow.com/questions/5005363/undefined-reference-to-sin
'IT story' 카테고리의 다른 글
@viewchild [duplicate]를 사용하여 여러 viewchildren에 액세스 (0) | 2020.09.04 |
---|---|
Java에서 다른 반환 유형으로 오버로드? (0) | 2020.09.04 |
상수는 정적으로 표시 할 수 없습니다. (0) | 2020.09.04 |
SQL Server 데이터베이스 복원 오류 : 지정된 캐스트가 유효하지 않습니다. (0) | 2020.09.04 |
다른 페이지의 부제목 또는 앵커에 상호 참조 추가 (0) | 2020.09.04 |