위의 모든 답변은 불완전하며 여기서 문제 ld
는 컴파일러가 아닌 링커에 있습니다 collect2: ld returned 1 exit status
. fib.c
to 객체를 컴파일 할 때 :
$ 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
다른 모든 플래그와 매개 변수 뒤에 플래그를 추가 하여 확실하게하십시오.
n