Tất cả các câu trả lời trên đều chưa đầy đủ, vấn đề ở đây nằm ở trình liên kết ld
hơn là trình biên dịch collect2: ld returned 1 exit status
. Khi bạn đang biên dịch fib.c
thành đối tượng:
$ gcc -c fib.c
$ nm fib.o
0000000000000028 T fibo
U floor
U _GLOBAL_OFFSET_TABLE_
0000000000000000 T main
U pow
U printf
Nơi nm
liệt kê các ký hiệu từ tệp đối tượng. Bạn có thể thấy rằng đây đã được biên soạn mà không có lỗi, nhưng pow
, floor
và printf
các chức năng có tài liệu tham khảo không xác định, bây giờ nếu tôi sẽ cố gắng liên kết này để thực thi:
$ 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
Tôi nhận được đầu ra tương tự như bạn nhận được. Để giải quyết vấn đề đó, tôi cần cho người liên kết biết nơi tìm kiếm các tham chiếu pow
và floor
, cho mục đích này, tôi sẽ sử dụng -l
cờ trình liên kết m
đến từ libm.so
thư viện.
$ 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__
Bây giờ bạn có thể thấy, các chức năng pow
, floor
được liên kết với GLIBC_2.2.5
.
Thứ tự tham số cũng quan trọng, trừ khi hệ thống của bạn được định cấu hình để sử dụng các thư viện dùng chung theo mặc định, hệ thống của tôi thì không, vì vậy khi tôi phát hành:
$ 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
Ghi chú -lm
cờ trước tệp đối tượng. Vì vậy, kết luận, hãy thêm -lm
cờ sau tất cả các cờ khác và các tham số, để chắc chắn.
n