2011-11-25 28 views
10

Tôi hiện đang sử dụng gcc để biên dịch và tôi cần sử dụng <math.h>. Vấn đề là nó sẽ không nhận ra thư viện. Tôi cũng đã thử -lm và không có gì. Chức năng tôi cố gắng sử dụng là ceil() và tôi nhận được lỗi sau:Liên kết với gcc và -lm không xác định ceil() trên Ubuntu

: undefined reference to `ceil' 
collect2: ld returned 1 exit status 

Tôi đang sử dụng Ubuntu mới nhất và math.h là ở đó. Tôi đã cố gắng sử dụng -lm trong một máy tính khác và nó hoạt động hoàn hảo.

Có ai biết cách giải quyết vấn đề này không?


Tôi đã bao gồm <math.h>. Ngoài ra, các lệnh tôi được sử dụng là:

gcc -lm -o fb file.c 
+4

Bạn có thể cung cấp dòng lệnh đầy đủ mà bạn đang sử dụng không? – Gian

+0

Và bạn có nhớ '#include ' trước khi bạn sử dụng 'ceil' không? –

+0

Tôi đã bao gồm math.h Ngoài ra, lệnh tôi đã sử dụng là: gcc -lm -o fb file.c – drum

Trả lời

17

Hãy mã này và đặt nó trong một tập tin ceil.c:

#include <math.h> 
#include <stdio.h> 
int main(void) 
{ 
    printf("%f\n", ceil(1.2)); 
    return 0; 
} 

Biên dịch nó với:

$ gcc -o ceil ceil.c 
$ gcc -o ceil ceil.c -lm 

Một trong hai nên làm việc . Nếu không hoạt động, hiển thị thông báo lỗi hoàn chỉnh cho mỗi lần biên dịch. Lưu ý rằng -lm xuất hiện sau tên của tệp nguồn (hoặc tệp đối tượng nếu bạn biên dịch nguồn thành đối tượng trước khi liên kết).

+0

@ Johnathan Leffler là có một cách để làm điều này mà không tpying -lm mỗi lần duy nhất trong quá trình biên dịch? – Brandon

+0

@Brandon: Di chuyển sang máy Mac? Các hàm từ '' nằm trong thư viện hệ thống chính, vì vậy bạn không cần phải chỉ rõ '-lm' (mặc dù có' libm.dylib' để cung cấp cho bạn một thư viện để liên kết nếu bạn chỉ định '-lm' trên dòng lệnh). Nếu không, hãy chắc chắn rằng bạn đang sử dụng một makefile và bạn có 'LDLIBS' (hoặc' LDLIBES') được đặt thành '-lm' nếu bạn sử dụng nó đủ để đảm bảo - hoặc viết các quy tắc cho mỗi chương trình bao gồm/loại trừ thư viện như theo yêu cầu của từng chương trình. Vì vậy, nói cách khác, "Không, không có cách nào để tránh chỉ định nó". Bạn có thể hỏi nhóm GLibC tại sao họ không đi đến một thư viện nào. –

+0

Lưu ý rằng nếu bạn tối ưu hóa mã, trình biên dịch có thể đánh giá 'ceil (1.2)' tại thời gian biên dịch và tránh sự cần thiết phải gọi hàm tại thời gian chạy, trong trường hợp đó bạn có thể không cần thư viện '-lm' ở tất cả. Nhưng đó sẽ là một trường hợp không rõ ràng đối với chương trình đơn giản trong ví dụ của tôi - nói chung, trình biên dịch sẽ không thể thực hiện tối ưu hóa đó và sau đó bạn cần liên kết với thư viện toán trừ khi các hàm đã có trong chính thư viện hệ thống. –

9

Không có đủ danh tiếng để nhận xét về câu trả lời của @ Jonathan Leffler. Chỉ muốn đề cập đến cuốn sách Expert C Programming của Peter van der Linden có cách xử lý tốt về chủ đề này trong chương 5 Thinking of Linking.

Archives (static libraries) are acted upon differently than are shared objects (dynamic libraries). With dynamic libraries, all the library symbols go into the virtual address space of the output file, and all the symbols are available to all the other files in the link. In contrast, static linking only looks through the archive for the undefined symbols presently known to the loader at the time the archive is processed.

Nếu bạn chỉ định thư viện toán học (mà thường là một trong những tĩnh) trước khi các file đối tượng của bạn, sau đó các mối liên kết sẽ không thêm bất kỳ biểu tượng.

2

Cố gắng biên soạn như thế:

gcc -Wall -g file.c -lm -o file 

tôi đã cùng một vấn đề và nó đã được giải quyết sử dụng lệnh này. Ngoài ra nếu bạn cài đặt Ubuntu của bạn cùng ngày bạn có vấn đề nó có thể là một vấn đề cập nhật.

+1

Câu hỏi này từ lâu đã được trả lời. – drum

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