sourcecode

'pow' 및 'floor'에 대한 참조가 정의되지 않았습니다.

copyscript 2022. 7. 31. 22:19
반응형

'pow' 및 'floor'에 대한 참조가 정의되지 않았습니다.

C에서 간단한 피보나치 계산기를 만들려고 하는데 컴파일할 때gcc전원과 바닥 기능이 부족하다고 하네요뭐가 잘못됐나요?

코드:

#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

링크 플래그를 사용하여 컴파일해야 합니다.-lm, 다음과 같이 합니다.

gcc fib.c -lm -o fibo

그러면 gcc가 코드를 math lib에 링크하도록 지시합니다.링크할 오브젝트 뒤에 플래그를 붙여주세요.

위의 답변은 모두 불완전합니다.문제는 링커에 있습니다.ld컴파일러가 아니라collect2: ld returned 1 exit status컴파일 할 때fib.c이의를 제기하는 경우:

$ 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.

파라미터의 순서도 중요합니다.단, 시스템이 디폴트로 공유 libra를 사용하도록 설정되어 있지 않은 한 시스템은 공유 libra를 사용하지 않기 때문에 다음 명령어를 발행합니다.

$ 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반드시 다른 모든 플래그와 파라미터 뒤에 플래그를 붙입니다.

나중에 이 글을 읽으려면 Fred가 말한 대로 링크해야 합니다.

gcc fib.c -lm -o fibo

링크해야 할 라이브러리를 찾는 좋은 방법 중 하나는 man 페이지가 있는지 확인하는 것입니다.예를들면,man pow그리고.man floor둘 다 알려드립니다.

링크처-lm.

C프로그래밍의 수학 라이브러리 링크에 대한 설명 - C프로그래밍의 링크

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

gcc fib.c -o fibo -lm

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

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

Project -> Properties -> C/C++ Build -> Settings -> GCC C Linker -> Miscelecential -> Linker 플래그: 이 필드에 명령어 lm을 추가합니다.

Fuzzy가 제공한 답변에 대해:

나는 사실 조금 다른 일을 해야 했다.

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

녹색 추가 아이콘을 클릭하고 m을 입력한 후 OK를 누릅니다.라이브러리이므로 이 창의 모든 항목에 -l이 자동으로 적용됩니다.

언급URL : https://stackoverflow.com/questions/8671366/undefined-reference-to-pow-and-floor

반응형