2011-11-25 60 views
10

我目前使用gcc編譯,我需要使用<math.h>。 問題是它不會識別庫。 我也試過-lm沒有。 我試圖使用該功能是ceil(),我得到以下錯誤:與gcc和-lm鏈接沒有在Ubuntu上定義ceil()

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

我使用的是最新的Ubuntu和math.h中是存在的。 我試圖在另一臺電腦上使用-lm,並且工作完美。

有誰知道如何解決這個問題?


我確實包括了<math.h>。另外,我用的命令是:

gcc -lm -o fb file.c 
+4

你能給出你正在使用的完整命令行嗎? – Gian

+0

你在使用'ceil'之前還記得'#include '嗎? –

+0

我確實包含了math.h 此外,我使用的命令是: gcc -lm -o fb file.c – drum

回答

17

把這個代碼,並把它放在一個文件ceil.c

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

其中一個兩個應該工作:

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

與編譯。如果兩者均不起作用,則顯示每個編譯的完整錯誤消息。請注意,-lm出現在源文件的名稱之後(或者如果在鏈接之前將源編譯爲對象,則爲目標文件)。

+0

@Johnathan Leffler有沒有一種方法可以在編譯期間不需要每次執行-lm? – Brandon

+0

@Brandon:遷移到Mac? ''的函數在主系統庫中,所以你不需要指定'-lm'(儘管有一個'libm.dylib'給你一個鏈接庫,如果你指定'-lm'在命令行上)。否則,請確保使用makefile,並且如果使用足夠的密碼來保證LDLIBS(或LDLIBES)設置爲-lm,或者編寫包含/排除該庫的每個程序規則每個程序都需要。換句話說,「不,沒有辦法避免指定它」。你可以問問GLibC團隊爲什麼他們沒有去一個圖書館。 –

+0

請注意,如果優化代碼,編譯器可以在編譯時評估「ceil(1.2)」,並避免在運行時調用該函數,在這種情況下,您可能不需要'-lm'庫在所有。但是在我的例子中,對於簡單的程序來說,這將是一個晦澀的邊緣情況 - 一般來說,編譯器將無法進行優化,然後您需要與數學庫鏈接,除非函數已經在main系統庫。 –

9

沒有足夠的聲望評論@Jonathan Leffler的回答。只想提到彼得範德林登的書Expert C Programming在第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.

如果您指定的目標文件之前,數學庫(這通常是一個靜態的),那麼鏈接器將不添加任何符號。

2

嘗試編譯這樣的:

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

我有同樣的問題,這是使用此命令解決。另外,如果您在問題出現的同一天安裝了Ubuntu,則可能是更新問題。

+1

這個問題早已得到解答。 – drum