programing

죄에 대한 정의되지 않은 참조

prostudy 2022. 5. 1. 20:14
반응형

죄에 대한 정의되지 않은 참조

나는 다음과 같은 코드를 가지고 있다(이 질문에 대한 기본적인 사항까지 강조).

#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" 실행 파일을 생성하는 단계에서 수학 라이브러리에 연결하십시오.

논평에서 리눅스D는 다음과 같이 묻는다.

왜?sin()<math.h>, 우리가 필요한가?-lm명시적으로 옵션. 그러나 다음에 대해서는 아니다.printf()<stdio.h>?

이 두 기능 모두 "단일 유닉스 규격"의 일부로 구현되기 때문이다.이 표준의 이력은 흥미롭고 많은 이름으로 알려져 있다(IEEE 규격 1003.1, X/Open Portability Guide, POSIX, Spec 1170).

이 표준은 특히 "표준 C 라이브러리" 루틴과 "표준 C 수학 라이브러리" 루틴(277페이지)을 구분한다.관련 구절은 다음과 같이 복사된다.

표준 C 라이브러리

표준 C 라이브러리는 다음에 의해 자동으로 검색됨cc외부 참조를 해결하다.이 라이브러리는 수학 루틴을 제외하고 제1권에서 정의한 베이스 시스템의 모든 인터페이스를 지원한다.

표준 C 수학 라이브러리

이 라이브러리는 볼륨 1에 정의된 기본 시스템 연산 루틴을 지원한다.cc옵션의-lm이 라이브러리를 검색하는 데 사용된다.

이러한 분리의 이면에 있는 추리는 다음과 같은 여러 요인에 의해 영향을 받았다.

  1. 유닉스 전쟁은 AT&T 유닉스 오리지널 제품과의 차이를 증가시켰다.
  2. UNIX 플랫폼의 수는 운영체제용 소프트웨어 개발에 어려움을 가중시켰다.
  3. 소프트웨어 개발자를 위한 가장 낮은 공통분모를 정의하려는 시도가 1988 POSIX라고 불렸다.
  4. 소프트웨어 개발자는 더 많은 플랫폼에 도달하기 위해 "POSIX 호환 시스템"에 소프트웨어를 제공하도록 POSIX 표준에 대해 프로그래밍했다.
  5. UNIX 고객들은 소프트웨어를 실행하기 위해 "POSIX 호환" UNIX 시스템을 요구했다.

결정을 내리는데 필요한 압박감은-lm다른 라이브러리에서 다음을 포함하지만 이에 국한되지는 않는다.

  1. 많은 응용 프로그램들이 수학 도서관에 내장된 기능을 사용하지 않기 때문에 libc의 크기를 줄이는 것은 좋은 방법인 것 같다.
  2. 그것은 수학 라이브러리 구현에 유연성을 제공하며, 어떤 수학 라이브러리는 더 큰 내장형 룩업 테이블에 의존하는 반면, 다른 것들은 더 작은 룩업 테이블(컴퓨팅 솔루션)에 의존할 수 있다.
  3. 크기가 제한된 응용 프로그램의 경우, 수학 라이브러리를 표준이 아닌 방식으로(예: 뽑기) 재구성을 허용한다.sin()그리고 그것을 맞춤식 도서관에 보관한다.

어떤 경우든 C언어의 일부로 자동 포함되지 않는 것이 이제는 표준의 일부분이며, 그렇기 때문에 반드시 추가해야 한다.-lm.

나는 여전히 에 문제가 있다.-lm추가됨:

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

나는 최근에 당신이 지정하면 그것이 작동하지 않는다는 것을 알았다.-lm첫째. 순서가 중요하다.지정해야 함-lm 마지막으로 다음과 같이 하십시오.

gcc mtest.c -o mtest.o -lm

그것은 문제없이 연결된다.

따라서 마지막에 라이브러리를 지정해야 한다.

수학 라이브러리와 연결해야 해, libm:

$ gcc -Wall foo.c -o foo -lm 

나도 같은 문제가 있었는데, 내 도서관을 마지막으로 나열한 후 없어졌다: gcc prog.c -lm.

참조URL: https://stackoverflow.com/questions/5005363/undefined-reference-to-sin

반응형