2012-05-02 26 views
62

我很新的C和我有這樣的代碼:即使我包含math.h頭文件,爲什麼會出現「undefined reference to sqrt」錯誤?

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

但是,當我編譯這個用:

gcc test.c -o test 

我得到這樣的錯誤:

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

爲什麼會發生? sqrt()不在math.h頭文件中?我得到與cosh和其他三角函數相同的錯誤。爲什麼?

+1

這裏有一些猜測爲什麼爲什麼'libm'沒有默認連接,即使它包含標準庫的一部分:http://stackoverflow.com/questions/1033898/why-do-you-have- to-link-the-math-library-in-c –

+0

這對這個是重複的:http://stackoverflow.com/q/5248919/694576 – alk

回答

102

在構建可執行文件時,必須將數學庫鏈接在一起。如何做到這一點的環境而異,但在的Linux/Unix,只需添加-lm的命令:

gcc test.c -o test -lm 

數學庫被命名爲libm.so-l命令選項假設一個lib前綴和.a.so後綴。

17

您需要用-lm鏈接器選項

您需要編譯爲

gcc test.c -o test -lm 

GCC(不是G ++)鏈接歷史上就沒有包含的數學函數,同時連接。它也已經從libc分離到一個單獨的庫libm中。要鏈接這些功能,您必須建議鏈接器包含庫-l鏈接器選項,後面接着庫名稱m,因此包含-lm

7

這可能是一個鏈接錯誤。 添加-lm開關來指定要對具有這些功能的定義標準C數學庫(libm)鏈接(頭只是表示他們聲明 - 值得期待差價)

4

因爲你沒有告訴鏈接器關於數學庫的位置。與GCC test.c的-o測試-lm

1

編譯添加報頭:

#include<math.h>

注:使用ABS(),有時在評價的sqrt()的時間可以取負值,其留給域錯誤。

abs() - 提供絕對值;

例如ABS(-3)= 3

在編譯時包含在您的命令的末尾-lm:

gcc <filename.extension> -lm

3

必須與您的代碼鏈接頭文件math.h。您可以通過在命令後鍵入-lm來完成此操作。

相關問題