2011-12-29 42 views
100

Tôi đang cố gắng tạo một máy tính đơn giản trong C nhưng khi biên dịch gcc cho tôi biết rằng tôi thiếu chức năng pow và floor. Chuyện gì vậy?Tham chiếu không xác định đối với `pow 'và` floor'

Code:

#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)); 
} 

Output:

[email protected]:~/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 
+0

Vì độ chính xác của dấu phẩy động không phải là vô hạn, điều này sẽ đưa ra câu trả lời sai cho các giá trị không quá lớn của 'n' – vonbrand

Trả lời

194

Bạn cần phải biên dịch với cờ -lm, như thế này:

gcc fib.c -lm -o fibo 

này sẽ cho gcc để liên kết mã của bạn chống lại lib toán học. Chỉ cần đảm bảo gắn cờ sau các đối tượng bạn muốn liên kết.

+6

Bạn có thể giải thích cách làm việc để đặt chữ sau-l? –

+41

Tìm trong/lib hoặc/usr/lib. Các thư viện được đặt tên là 'lib .a' hoặc' lib .so' - đó là "" mà bạn đặt sau '-l'. Trong trường hợp này, thư viện toán học được đặt tên là 'libm.so', vì vậy chúng ta gọi nó là' -lm'. – ams

+3

Cảm ơn! Tôi đã googling trong 30 phút qua và đây là tài liệu tham khảo đầu tiên cho biết để liên kết các thư viện sau khi các đối tượng –

24

Thêm -lm với các tùy chọn liên kết của bạn, vì pow() và sàn() là một phần của thư viện toán học:

gcc fib.c -o fibo -lm 
6

Để tìm điểm mà để thêm -lm trong Eclipse IDE thực sự là khủng khiếp, vì vậy nó đã cho tôi một thời gian.

Nếu ai đó còn sử dụng Edlipse, đây là cách làm thế nào để thêm lệnh:

Project -> Properties -> C/C++ Build -> Settings -> GCC C Linker -> Miscelleaneous -> Linker cờ: trong trường này, thêm lệnh -lm

8

Liên quan đến câu trả lời được cung cấp bởi Fuzzy:

Tôi thực sự phải làm điều gì đó hơi khác.

Project -> Properties -> C/C++ Build -> Settings -> GCC C Linker -> Libraries

Nhấp vào chút màu xanh lá cây biểu tượng add, gõ m và nhấn ok. Mọi thứ trong cửa sổ này sẽ tự động áp dụng cho nó vì nó là một thư viện.

9

Để tiện lợi hơn bất cứ ai đọc bài viết này sau đó, bạn cần phải liên kết chống lại nó như Fred nói:

gcc fib.c -lm -o FIBO

Một cách tốt để tìm hiểu những gì bạn cần thư viện để liên kết là bằng cách kiểm tra trang người đàn ông, nếu có. Ví dụ: "man pow" và "man floor" sẽ cho bạn biết:

Liên kết với -lm.

Các vấn đề liên quan