2012-05-02 34 views
62

Tôi rất mới đến C và tôi có mã này:Tại sao tôi nhận được lỗi "không xác định tham chiếu đến sqrt" mặc dù tôi bao gồm tiêu đề math.h?

#include <stdio.h> 
#include <math.h> 
int main(void) 
{ 
    double x = 0.5; 
    double result = sqrt(x); 
    printf("The square root of %lf is %lf\n", x, result); 
    return 0; 
} 

Nhưng khi tôi biên dịch này với:

gcc test.c -o test 

tôi nhận được một lỗi như thế này:

/tmp/cc58XvyX.o: In function `main': 
test.c:(.text+0x2f): undefined reference to `sqrt' 
collect2: ld returned 1 exit status 

Lý do tại sao điều này xảy ra? Có phải sqrt() không có trong tệp tiêu đề math.h không? Tôi gặp lỗi tương tự với cosh và các hàm lượng giác khác. Tại sao?

+1

Và đây là một số suy đoán tại sao về lý do tại sao 'libm' không được liên kết theo mặc định mặc dù nó chứa một phần của thư viện chuẩn: http://stackoverflow.com/questions/1033898/why-do-you-have- to-link-the-math-library-in-c –

+0

Nó trùng lặp với cái này: http://stackoverflow.com/q/5248919/694576 – alk

Trả lời

102

Thư viện toán phải được liên kết khi xây dựng tệp thi hành. Làm thế nào để làm điều này thay đổi theo môi trường, nhưng trong Linux/Unix, chỉ cần thêm -lm để lệnh:

gcc test.c -o test -lm 

Thư viện toán học được đặt tên libm.so, và các tùy chọn lệnh -l giả định một tiền tố lib.a hoặc .so hậu tố.

17

Bạn cần phải liên kết với các tùy chọn -lm mối liên kết

Bạn cần phải biên dịch như

gcc test.c -o test -lm 

gcc (Không g ++) lịch sử sẽ không theo mặc định bao gồm các chức năng toán học trong khi liên kết. Nó cũng đã được tách ra khỏi libc vào một thư viện riêng biệt libm. Để liên kết với các chức năng này, bạn phải thông báo cho trình liên kết để bao gồm tùy chọn liên kết thư viện -l theo sau là tên thư viện m do đó -lm.

7

Đây có thể là lỗi liên kết. Thêm -lm tắc để xác định rằng bạn muốn liên kết chống lại các thư viện chuẩn C toán (libm) trong đó có các định nghĩa cho những chức năng (tiêu đề chỉ có khai cho họ -. Giá trị xem xét nên sự khác biệt)

4

Vì bạn không nói cho người liên kết biết vị trí của thư viện toán. Biên dịch với gcc test.c -o test -lm

1

Thêm tiêu đề:

#include<math.h>

Lưu ý: sử dụng abs(), đôi khi tại thời điểm sqrt đánh giá() có thể mất giá trị âm mà để lại lỗi miền.

abs() - cung cấp các giá trị tuyệt đối;

dụ, abs (-3) = 3

Bao gồm -lm vào cuối lệnh của bạn trong thời gian biên soạn:

gcc <filename.extension> -lm

3

Bạn phải liên kết các tập tin tiêu đề math.h với mã của bạn.Bạn có thể làm điều này bằng cách gõ -lm sau lệnh của bạn.

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