2012-04-07 21 views
8

Tôi có một chương trình c gọi sin, cos và acos. Khi tôi biên dịch, tôi nhận được các lỗi sau:GCC libm không hoạt động

/tmp/ccDfW98S.o: In function `zip_search': 
main.c:(.text+0xf30): undefined reference to `sin' 
main.c:(.text+0xf45): undefined reference to `sin' 
main.c:(.text+0xf66): undefined reference to `cos' 
main.c:(.text+0xf7b): undefined reference to `cos' 
main.c:(.text+0xf9c): undefined reference to `cos' 
main.c:(.text+0xfc6): undefined reference to `acos' 
collect2: ld returned 1 exit status 

Tôi biết điều này là phổ biến khi bạn không sử dụng cờ gcc-lm. Tôi đang sử dụng lá cờ này. Tôi đang gọi GCC như sau:

gcc -o zipcode-server -lm main.c 

Khi tôi biên dịch trên một trong các máy tính của tôi, tính năng này hoạt động tốt. Sự khác biệt duy nhất mà tôi có thể nghĩ đến là điều này không hoạt động trên x86_64 và máy tính mà nó hoạt động trên đó là i686. Cả hai đều là Ubuntu. Các tập tin libm.a có mặt trên máy tính nó không hoạt động và tôi không nhận được bất kỳ lỗi nào nói rằng nó không thể được tìm thấy. Điều gì có thể gây ra điều này?

+0

Bạn có thể vui lòng đăng phần có liên quan của mã để chúng tôi có thể giúp bạn khắc phục sự cố không? – krzysz00

+1

Chỉ để thử vui: 'gcc -o zipcode-server main.c -lm' –

Trả lời

18

Bạn nên đặt -lm sau main.c

Nói chung, nếu bạn có nhiều thư viện, họ nên được viết theo thứ tự sử dụng của họ. Ví dụ: nếu thư viện A sử dụng thư viện B, bạn phải có -lA -lB.

Trong trường hợp của bạn, tệp đối tượng là kết quả của việc biên soạn main.c sử dụng thư viện m và do đó -lm nên đến sau nó.


Vì tò mò, điều này chủ yếu vì lý do hiệu quả. Với lược đồ này, trình liên kết có thể giải quyết các biểu tượng hiện chưa biết với mỗi thư viện mới được thấy trong danh sách đối số và chọn các ký hiệu không xác định mới từ thư viện đó trên đường đi. Điều này có nghĩa là người liên kết có thể truy cập từng thư viện và do đó khớp với các biểu tượng không xác định đối với một số lượng nhỏ ký hiệu được cung cấp bởi mỗi thư viện.

Ngược lại, trình liên kết có thể tải trong các biểu tượng từ tất cả các thư viện cùng một lúc, và sau đó bắt đầu khớp các ký hiệu không xác định. Tuy nhiên, trong trường hợp đó, trình liên kết cần phải đối phó với một số lượng lớn hơn các ký hiệu, tăng cả lượng bộ nhớ và thời gian thực hiện của trình liên kết.

Vì các thư viện luôn có thể được khai báo cho trình liên kết theo đúng thứ tự phụ thuộc của chúng , không có lý do gì để trình liên kết chọn cách không hiệu quả.

Thư viện thường có mối quan hệ một chiều, theo nghĩa là người ta sử dụng mối quan hệ khác. Thông tin phụ thuộc giữa các thư viện là rất hiếm, nếu ở tất cả hiện tại, nhưng nó vẫn có thể được sử dụng với mô hình này bằng cách lặp lại một số thư viện để được reinspected.

+0

Wow. Đó là nó, cảm ơn. – Stewart