'pow'및 'floor'에 대한 정의되지 않은 참조


124

C로 간단한 피보나치 계산기를 만들려고하는데 컴파일 할 때 gccpow 및 floor 함수가 없다고 알려줍니다. 뭐가 문제 야?

암호:

#include <stdio.h>
#include <math.h>

int fibo(int n);

int main() {
        printf("Fib(4) = %d", fibo(4));
        return 0;
}

int fibo(int n) {
        double phi = 1.61803399;

        return (int)(floor((float)(pow(phi, n) / sqrt(5)) + .5f));
}

산출:

gab@testvm:~/work/c/fibo$ gcc fib.c -o fibo
/tmp/ccNSjm4q.o: In function `fibo':
fib.c:(.text+0x4a): undefined reference to `pow'
fib.c:(.text+0x68): undefined reference to `floor'
collect2: ld returned 1 exit status

부동 소수점 정밀도가 무한하지 않기 n
때문에이


훨씬 더 쉽게 솔루션은 단순히 대신 ++ g을 사용하여 존재하는 것 같다 : g ++ fib.c -o FIBO
OrenIshShalom

답변:


242

다음과 같이 링크 플래그로 컴파일해야합니다 -lm.

gcc fib.c -lm -o fibo

그러면 gcc가 코드를 math lib에 연결하도록 지시합니다. 링크하려는 객체 뒤에 플래그를 두십시오 .


7
-l 뒤에 넣을 문자를 어떻게 계산하는지 설명해 주시겠습니까?
Gabriele Cirulli 2011

48
/ lib 또는 / usr / lib를 찾습니다. 라이브러리는 모두 이름이 지정 lib<name>.a되거나 lib<name>.so- -l. 이 경우 수학 라이브러리의 이름 libm.so은이므로 -lm.
ams dec

3
감사! 나는 지난 30 분 동안 인터넷 검색을 해왔고 이것은 객체 뒤에 라이브러리를 연결한다고 말한 첫 번째 참조입니다
Dave Baghdanov

또한 LD_PRELOAD를 사용하여 ld 런타임 링커에
libm.so를

답변 해주셔서 감사합니다. 그러나 아무도 몇 줄의 코드의 경우 컴파일하는 동안 -lm을 포함하지 않아도 괜찮은 이유를 말할 수 있습니까?
MItrajyoti Kusari

24

pow () 및 floor ()는 수학 라이브러리의 일부이므로 링크 옵션에 -lm을 추가합니다.

gcc fib.c -o fibo -lm

9

나중에이 글을 읽는 사람의 이익을 위해 Fred가 말한대로 링크해야합니다.

gcc fib.c -lm -o fibo

링크해야하는 라이브러리를 찾는 한 가지 좋은 방법은 매뉴얼 페이지가 있는지 확인하는 것입니다. 예를 들어, man powman floor 모두 당신을 말할 것이다 :

연결 -lm .

C 프로그래밍에서 수학 라이브러리 연결에 대한 설명-C로 연결


8

Fuzzy가 제공 한 답변과 관련하여 :

나는 실제로 약간 다른 것을해야했다.

프로젝트-> 속성-> C / C ++ 빌드-> 설정-> GCC C 링커-> 라이브러리

작은 녹색 추가 아이콘을 클릭하고 m을 입력 한 다음 확인을 누르십시오. 이 창의 모든 것은 라이브러리이기 때문에 자동으로 -l이 적용됩니다.


6

Eclipse-IDE에서 -lm을 추가 할 지점을 찾는 것은 정말 끔찍하므로 시간이 좀 걸렸습니다.

다른 사람도 Edlipse를 사용하는 경우 명령을 추가하는 방법은 다음과 같습니다.

프로젝트-> 속성-> C / C ++ 빌드-> 설정-> GCC C 링커-> 기타-> 링커 플래그 :이 필드에 -lm 명령을 추가합니다.


0

위의 모든 답변은 불완전하며 여기서 문제 ld는 컴파일러가 아닌 링커에 있습니다 collect2: ld returned 1 exit status. fib.cto 객체를 컴파일 할 때 :

$ gcc -c fib.c
$ nm fib.o
0000000000000028 T fibo
                 U floor
                 U _GLOBAL_OFFSET_TABLE_
0000000000000000 T main
                 U pow
                 U printf

어디 nm오브젝트 파일의 목록을 상징. 이가 오류없이 컴파일 된 것을 볼 수 있지만 pow, floor하고 printf나는 실행이 연결을 시도합니다 경우 함수는 현재 정의되지 않은 참조가 :

$ gcc fib.o
fib.o: In function `fibo':
fib.c:(.text+0x57): undefined reference to `pow'
fib.c:(.text+0x84): undefined reference to `floor'
collect2: error: ld returned 1 exit status

나는 당신이 얻는 유사한 출력을 얻고 있습니다. 그것을 해결하기 위해, 나는 어디에 대한 참조를 찾을하는 링커 말할 필요 pow하고 floor,이 목적을 위해 내가 링커 사용 -l플래그 m에서 제공하는 libm.so라이브러리를.

$ gcc fib.o -lm
$ nm a.out
0000000000201010 B __bss_start
0000000000201010 b completed.7697
                 w __cxa_finalize@@GLIBC_2.2.5
0000000000201000 D __data_start
0000000000201000 W data_start
0000000000000620 t deregister_tm_clones
00000000000006b0 t __do_global_dtors_aux
0000000000200da0 t 
__do_global_dtors_aux_fini_array_entry
0000000000201008 D __dso_handle
0000000000200da8 d _DYNAMIC
0000000000201010 D _edata
0000000000201018 B _end
0000000000000722 T fibo
0000000000000804 T _fini
                 U floor@@GLIBC_2.2.5
00000000000006f0 t frame_dummy
0000000000200d98 t __frame_dummy_init_array_entry
00000000000009a4 r __FRAME_END__
0000000000200fa8 d _GLOBAL_OFFSET_TABLE_
                 w __gmon_start__
000000000000083c r __GNU_EH_FRAME_HDR
0000000000000588 T _init
0000000000200da0 t __init_array_end
0000000000200d98 t __init_array_start
0000000000000810 R _IO_stdin_used
                 w _ITM_deregisterTMCloneTable
                 w _ITM_registerTMCloneTable
0000000000000800 T __libc_csu_fini
0000000000000790 T __libc_csu_init
                 U __libc_start_main@@GLIBC_2.2.5
00000000000006fa T main
                 U pow@@GLIBC_2.2.5
                 U printf@@GLIBC_2.2.5
0000000000000660 t register_tm_clones
00000000000005f0 T _start
0000000000201010 D __TMC_END__

이제 함수를 볼 수 있습니다 pow, floor연결되어 있습니다 GLIBC_2.2.5.

매개 변수 순서도 중요합니다. 시스템이 기본적으로 공유 라이브러리를 사용하도록 구성되어 있지 않으면 내 시스템은 그렇지 않습니다.

$ gcc -lm fib.o
fib.o: In function `fibo':
fib.c:(.text+0x57): undefined reference to `pow'
fib.c:(.text+0x84): undefined reference to `floor'
collect2: error: ld returned 1 exit status

참고 -lm오브젝트 파일 전에 플래그. 따라서 결론적으로 -lm다른 모든 플래그와 매개 변수 뒤에 플래그를 추가 하여 확실하게하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.