죄에 대한 정의되지 않은 참조
나는 다음과 같은 코드를 가지고 있다(이 질문에 대한 기본적인 사항까지 강조).
#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()
에<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
이 라이브러리를 검색하는 데 사용된다.
이러한 분리의 이면에 있는 추리는 다음과 같은 여러 요인에 의해 영향을 받았다.
- 유닉스 전쟁은 AT&T 유닉스 오리지널 제품과의 차이를 증가시켰다.
- UNIX 플랫폼의 수는 운영체제용 소프트웨어 개발에 어려움을 가중시켰다.
- 소프트웨어 개발자를 위한 가장 낮은 공통분모를 정의하려는 시도가 1988 POSIX라고 불렸다.
- 소프트웨어 개발자는 더 많은 플랫폼에 도달하기 위해 "POSIX 호환 시스템"에 소프트웨어를 제공하도록 POSIX 표준에 대해 프로그래밍했다.
- UNIX 고객들은 소프트웨어를 실행하기 위해 "POSIX 호환" UNIX 시스템을 요구했다.
결정을 내리는데 필요한 압박감은-lm
다른 라이브러리에서 다음을 포함하지만 이에 국한되지는 않는다.
- 많은 응용 프로그램들이 수학 도서관에 내장된 기능을 사용하지 않기 때문에 libc의 크기를 줄이는 것은 좋은 방법인 것 같다.
- 그것은 수학 라이브러리 구현에 유연성을 제공하며, 어떤 수학 라이브러리는 더 큰 내장형 룩업 테이블에 의존하는 반면, 다른 것들은 더 작은 룩업 테이블(컴퓨팅 솔루션)에 의존할 수 있다.
- 크기가 제한된 응용 프로그램의 경우, 수학 라이브러리를 표준이 아닌 방식으로(예: 뽑기) 재구성을 허용한다.
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
'programing' 카테고리의 다른 글
Vue.js: 구성 요소가 초기화될 때 감시기 기능을 작동시키는 방법 (0) | 2022.05.01 |
---|---|
TypeScript가 Vue 플러그인에 대한 모듈 확장을 인식하지 못하는 이유 (0) | 2022.05.01 |
웹서버에 완성된 nnxt.js 앱을 배포하는 방법? (0) | 2022.05.01 |
스파크 작업에 JAR 파일 추가 - 스파크 제출 (0) | 2022.05.01 |
C 코드에서 Python 코드를 어떻게 부릅니까? (0) | 2022.04.29 |