2012-06-07 63 views
1

簡單的問題。我將以前由別人編寫的代碼導入到eclipse中。我得到的錯誤: 「未定義參考`ceilf'」「未定義參考`ceilf'」

當我使用celif。在我看來,celif假設包含在我的ile中包含的math.h庫中。但是,當我打開/usr/include/math.h文件時,沒有看到定義的ceilf方法。事實上,據我所知,我的redhat部署中的math.h文件都沒有ceilf方法。任何想法定義任性的ceilf方法?由於這些代碼可以工作,甚至可以在其他地方編譯,所以問題必須與我的配置相關,而不是代碼本身。

ps。我可以使用常規的ceil方法。我考慮過只是轉而使用它,但在程序的關鍵路徑中效率會更低。是的,我知道不成熟的優化是邪惡的,但我總是出於好奇而問爲什麼我會有錯誤。我看不出爲什麼我的math.h文件不會污染它。

編輯:: 謝謝你解釋爲什麼我找不到ceilf功能,我理解這個問題。但是,我不知道如何安撫日食。我試着按照建議設置編譯器選項來使用std = c99,並且不刪除錯誤。事實上,我認爲eclipse只是使用我的Makefile來完成構建,而make文件不會拋出異常。有什麼我可以做,讓編輯認識到我有定義的文件?

+2

'ceilf'符合C99。如果你正在編譯一個較舊的標準,那個函數將不會在那裏。嘗試使用-'std = c99'進行編譯。 –

回答

6

ceilf是數學庫的一部分,所以你需要-lm鏈接到使用它。只是#include <math.h>是不夠的。

+0

我已經檢查過,math.h文件似乎沒有ceilf的定義,儘管它應該是math.h的一部分。這就是問題的出發點 – dsollen

2

根據手冊頁:

Feature Test Macro Requirements for glibc (see feature_test_macros(7)): 

     ceilf(), ceill(): 
      _BSD_SOURCE || _SVID_SOURCE || _XOPEN_SOURCE >= 600 || 
      _ISOC99_SOURCE || _POSIX_C_SOURCE >= 200112L; 
      or cc -std=c99 

嘗試設置標準C99在你的編譯器或啓用這些功能測試宏之一。

另外,還要確保你與-lm或您的平臺和編譯器的數學庫鏈接適當的開關連接。

+0

這解決了編譯器錯誤的問題,但「未定義的引用」是一個鏈接器錯誤,在某些系統上未與「libm」鏈接時發生。 –

+0

我試過這個,它沒有工作。另外,eclipse只能運行make來編譯所有東西;這是我迷惑的一部分。如果我自己在命令行中創建這個程序,它會運行良好並生成,但如果eclipse執行了構建(根據我的理解,這意味着調用相同的make文件),我會得到異常? – dsollen

+0

Eclipse不一定使用構建目錄中的Makefile。檢查當前項目的構建配置(在Eclipse中)。 –