คำตอบทั้งหมดข้างต้นจะไม่สมบูรณ์ปัญหาที่นี่อยู่ในลิงเกอร์มากกว่าคอมไพเลอร์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
ลำดับพารามิเตอร์ก็สำคัญเช่นกันเว้นแต่ระบบของคุณจะได้รับการกำหนดค่าให้ใช้ไลบรารีที่ใช้ร่วมกันตามค่าเริ่มต้นระบบของฉันไม่ได้ดังนั้นเมื่อฉันออก:
$ 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