IT story

`sin`에 대한 정의되지 않은 참조

hot-time 2020. 9. 4. 08:08
반응형

`sin`에 대한 정의되지 않은 참조


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

다음 코드가 있습니다 (이 질문에 대한 기본 사항으로 요약).

#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실행 파일 생성을 시도하는 단계에서 수학 라이브러리와 연결하기 위해 " "를 추가 합니다.

에서 코멘트 , linuxD는 묻는다 :

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은이 라이브러리를 검색하는 데 사용됩니다.

이 분리의 이유는 다음과 같은 여러 요인의 영향을 받았습니다.

  1. UNIX 전쟁은 원래 AT & T UNIX 제공에서 발산 증가되었다.
  2. UNIX 플랫폼의 수는 운영 체제 용 소프트웨어 개발에 어려움을 더했습니다.
  3. 소프트웨어 개발자를위한 최저 공통 분모를 정의하려는 시도 인 1988 POSIX 가 시작되었습니다 .
  4. 더 많은 플랫폼에 도달하기 위해 "POSIX 호환 시스템"에서 소프트웨어를 제공하도록 POSIX 표준에 따라 프로그래밍 된 소프트웨어 개발자.
  5. UNIX 고객은 소프트웨어를 실행하기 위해 "POSIX 호환"UNIX 시스템을 요구했습니다.

-lm다른 라이브러리 에 배치하기로 결정한 압력은 다음 과 같지만 이에 국한되지는 않습니다.

  1. 많은 응용 프로그램이 수학 라이브러리에 포함 된 함수를 사용하지 않기 때문에 libc의 크기를 줄이는 좋은 방법 인 것 같습니다.
  2. 일부 수학 라이브러리는 더 큰 임베디드 조회 테이블에 의존하고 다른 일부는 더 작은 조회 테이블 (컴퓨팅 솔루션)에 의존 할 수있는 수학 라이브러리 구현에 유연성을 제공합니다.
  3. 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

반응형