2011-11-25 1 views
10

현재 gcc를 사용하여 컴파일 중이므로 <math.h>을 사용해야합니다. 문제는 라이브러리를 인식하지 못하기 때문입니다. 나는 또한 -lm와 아무것도 시도했다. 내가 사용하려고 기능은 ceil()이었고, 나는 다음과 같은 오류가 발생합니다 :gcc와 -lm을 연결하면 우분투에서 ceil()이 정의되지 않습니다

: undefined reference to `ceil' 
collect2: ld returned 1 exit status 

나는 최신 우분투를 사용하고 있습니다 및 math.h이있다. -lm을 다른 컴퓨터에서 사용해 보았는데 완벽하게 작동합니다.

누구든지이 문제를 해결하는 방법을 알고 있습니까?


나는 <math.h>을 포함했다. 또한, 내가 사용하는 명령이었다 : 그 두 가지의

$ gcc -o ceil ceil.c 
$ gcc -o ceil ceil.c -lm 

하나는 작동합니다 :

#include <math.h> 
#include <stdio.h> 
int main(void) 
{ 
    printf("%f\n", ceil(1.2)); 
    return 0; 
} 

가 함께 컴파일

gcc -lm -o fb file.c 
+4

사용중인 전체 명령 줄을 제공 할 수 있습니까? – Gian

+0

'ceil'을 사용하기 전에'#include '을 기억 했습니까? –

+0

math.h를 포함 시켰습니다 또한 사용하는 명령은 다음과 같습니다 : gcc -lm -o fb file.c – drum

답변

17

이 코드를 가지고 파일 ceil.c에 넣어 . 둘 다 작동하지 않으면 각 컴파일에 대한 전체 오류 메시지를 표시하십시오. -lm은 소스 파일의 이름 뒤에 표시됩니다 (링크하기 전에 소스를 컴파일하려면 오브젝트 파일).

+0

@Johnathan Leffler는 컴파일하는 동안 매번 tpying하지 않고이 작업을 수행 할 수있는 방법이 있습니까? – Brandon

+0

@Brandon : Mac으로 마이그레이션 하시겠습니까? ''의 함수는 메인 시스템 라이브러리에 있으므로'-lm'을 지정할 필요가 없습니다 ('-lm'을 지정하면 링크 할 라이브러리를 제공하는'libm.dylib '가 있지만). 명령 줄에서). 그렇지 않으면 메이크 파일을 사용하고 있는지 확인하고 라이브러리를 보증하기에 충분하다면'LDLIB '(또는'LDLIBES')를'-lm'으로 설정하십시오. 또는 라이브러리를 포함/제외하는 프로그램 별 규칙을 작성하십시오 각 프로그램에서 필요합니다. 즉, "아니오, 지정하지 않는 방법은 없습니다". GLibC 팀에게 왜 그들이 단일 도서관에 가지 않았는지 물어볼 수 있습니다. –

+0

코드를 최적화하면 컴파일러가 컴파일시'ceil (1.2)'를 평가할 수 있으며 런타임에 함수를 호출 할 필요가 없으므로'-lm' 라이브러리가 필요하지 않을 수도 있습니다 조금도. 하지만 이것은 단순한 프로그램에 대한 모호한 예가 될 것입니다. 일반적으로 컴파일러는 최적화 작업을 수행 할 수 없으며 함수가 이미 메인에 있지 않으면 수학 라이브러리와 링크해야합니다. 시스템 라이브러리. –

9

@Jonathan Leffler의 답변에 대한 평판이 충분하지 않습니다. 단지 Peter van der Linden의 책 Expert C Programming이 5 장의이 주제에 대한 좋은 대우를 가지고 있다고 말하고 싶습니다. Thinking of Linking.

Archives (static libraries) are acted upon differently than are shared objects (dynamic libraries). With dynamic libraries, all the library symbols go into the virtual address space of the output file, and all the symbols are available to all the other files in the link. In contrast, static linking only looks through the archive for the undefined symbols presently known to the loader at the time the archive is processed.

오브젝트 파일보다 앞에 수학 라이브러리 (일반적으로 정적 파일)를 지정하면 링커에서 기호를 추가하지 않습니다. 그런 식으로 컴파일

2

시도 :

gcc -Wall -g file.c -lm -o file 

은 저도 같은 문제를 겪고 있으며이 명령을 사용하여 해결되었다. 또한 Ubuntu를 설치 한 경우 문제가 발생하는 당일에 업데이트 문제 일 수 있습니다.

+1

이 질문에 대한 답변을 오랫동안 남겼습니다. – drum

관련 문제