Saya mencoba membuat kalkulator fibonacci sederhana dalam C tetapi saat menyusun gcc
memberi tahu saya bahwa saya kehilangan fungsi pow dan floor. Apa yang salah?
Kode:
#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));
}
Keluaran:
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
c
gcc
undefined-reference
Gabriele Cirulli
sumber
sumber
n
Jawaban:
Anda perlu mengkompilasi dengan flag link
-lm
, seperti ini:Ini akan memberi tahu gcc untuk menautkan kode Anda ke lib matematika. Pastikan untuk meletakkan bendera setelah objek yang ingin Anda tautkan.
sumber
lib<name>.a
ataulib<name>.so
- ini adalah "<name>" yang Anda letakkan setelah-l
. Dalam hal ini, perpustakaan matematika diberi namalibm.so
, jadi kami menyebutnya-lm
.Tambahkan -lm ke opsi tautan Anda, karena pow () dan floor () adalah bagian dari pustaka matematika:
sumber
Untuk kepentingan siapa pun yang membaca ini nanti, Anda perlu menautkannya seperti yang dikatakan Fred:
Salah satu cara yang baik untuk mengetahui perpustakaan apa yang perlu Anda tautkan adalah dengan memeriksa halaman manual jika ada. Misalnya,
man pow
danman floor
keduanya akan memberi tahu Anda:Berhubungan dengan
-lm
.Penjelasan untuk menghubungkan perpustakaan matematika dalam pemrograman C - Menghubungkan dalam C
sumber
Mengenai jawaban yang diberikan oleh Fuzzy:
Saya sebenarnya harus melakukan sesuatu yang sedikit berbeda.
Proyek -> Properti -> Bangun C / C ++ -> Pengaturan -> GCC C Linker -> Perpustakaan
Klik ikon tambah hijau kecil, ketik m dan tekan ok. Segala sesuatu di jendela ini secara otomatis menerapkan -l padanya karena ini adalah perpustakaan.
sumber
Untuk menemukan titik di mana menambahkan -lm di Eclipse-IDE benar-benar mengerikan, jadi saya butuh waktu.
Jika orang lain juga menggunakan Edlipse, berikut cara menambahkan perintahnya:
Project -> Properties -> C / C ++ Build -> Settings -> GCC C Linker -> Miscelleaneous -> Linker flags: di kolom ini tambahkan perintah -lm
sumber
Semua jawaban di atas tidak lengkap, masalahnya di sini terletak pada linker
ld
daripada compilercollect2: ld returned 1 exit status
. Saat Anda menyusunfib.c
to object:Dimana
nm
daftar simbol dari file objek. Anda dapat melihat bahwa ini disusun tanpa kesalahan, namunpow
,floor
danprintf
fungsi memiliki referensi undefined, jika saya akan mencoba untuk menghubungkan ini untuk dieksekusi:Saya mendapatkan hasil serupa yang Anda dapatkan. Untuk mengatasinya, saya perlu memberi tahu linker di mana mencari referensi
pow
, danfloor
, untuk tujuan ini saya akan menggunakan-l
bendera linkerm
yang berasal darilibm.so
perpustakaan.Anda sekarang dapat melihat, fungsi
pow
,floor
ditautkanGLIBC_2.2.5
.Urutan parameter juga penting, kecuali sistem Anda dikonfigurasi untuk menggunakan perpustakaan bersama secara default, sistem saya tidak, jadi ketika saya mengeluarkan:
Catatan
-lm
bendera sebelum file objek. Jadi sebagai kesimpulan, tambahkan-lm
flag setelah semua flag dan parameter lainnya, untuk memastikan.sumber