2011-11-21 135 views
2

我在我的應用程序的鏈接過程中發現問題。我沒有與gcc 4.5相同的。它試圖將數學庫鏈接到以下命令。在GCC 4.6.1中鏈接數學庫(Ubuntu 11.10)

gcc -Wall -Wno-unused -MD -o mems_seektest mems_seektest.o -lm -L. -g -DASSERTS -I../src// -I../ -I../src//src -DDEBUG -lmems_internals 

,並報告以下錯誤按摩:

undefined reference to `sqrt' 

任何想法?

+0

我不能重現這一點(在Linux中使用gcc 4.6.2),這個代碼與gcc 4.5一起構建? – birryree

+0

@birryree當然,如果你使用'float test = sqrt(5);'這樣的東西,'因爲gcc會通過在編譯時計算結果來優化它。嘗試使用像'float test = sqrt(a);'這裏的a是一個變量,它的值只有在運行時才能知道。 – starrify

+0

@PengyuCHEN - 我沒有使用常量,我知道gcc的常量摺疊。正如你所看到的,他已經在使用'-lm'標誌,所以你的答案重複了他所做的一切。 – birryree

回答

0

我想說鏈接器使用錯誤的libm。

3

你沒告訴我們什麼-lmems_internals是,但也許是未解決的符號來自那裏。 -l選項的順序通常對鏈接器很重要,您應該始終將系統庫放到最後。

您可以檢查在未解決的象徵,極受如果在sqrt前面U的符號是未定義使用類似

nm yourLibrary | grep sqrt 

從何而來。

5

最近的gcc/ld使用的--as需要的鏈接器標記爲默認值。實際上,這意味着庫必須以與命令行相關的相反順序來指定。如果mems_internals庫在-lmems_internals之後需要sqrt函數,則需要-lm。

gcc -Wall -Wno-unused -MD -o mems_seektest mems_seektest.o -L. -g -DASSERTS -I../src// -I../ -I../src//src -DDEBUG -lmems_internals -lm 
3

我和gcc 4.6.1有同樣的問題,即使只有一個庫。這不起作用:

$ gcc -lm eg.o -o eg 
eg.o: In function `foo': 
/home/nick/tmp/eg.c:5: undefined reference to `sqrt' 
collect2: ld returned 1 exit status 

但這:

$ gcc eg.o -o eg -lm 

我打了這一點,因爲我在我的Makefile中使用 「LDFLAGS = -lm」。如果您使用「LDLIBS = -lm」,則可以正常工作。

+0

-lm放在eg.o($ ^)之後總是更好。 –