2013-05-02 110 views
6

我正在使用math.h-lm選項進行編譯。我已經嘗試了所有的:「未定義的引用'pow'」甚至與math.h和庫鏈接-lm

gcc -o ssf ssf_tb.c ssf.c -lm 
gcc -o ssf ssf_tb.c -lm ssf.c 
gcc -o -lm ssf -lm ssf_tb.c ssf.c 

但錯誤:

undefined reference to 'pow' 

發生在所有的情況下。

+0

你可以發佈'ssf_tb.c'的代碼嗎? – higuaro 2013-05-02 17:47:36

+0

'gcc -o -lm ssf -lm ssf_tb.c ssf.c' < - 你的意思是讓'-lm'兩次? – Kevin 2013-05-02 17:48:15

+2

在這3條命令行中只有第一條應該起作用。你確定你試過嗎? – 2013-05-02 17:48:44

回答

17

-lm放在行末。

gcc處理指定輸入到最終程序的參數,它們按它們在命令行上的顯示順序排列。 -lm參數被傳遞給鏈接器,例如ssf.c參數被編譯,並且生成的目標文件被傳遞給鏈接器。

鏈接器也按順序處理輸入。當它看到一個庫時,如-lm指定,它會查看該庫是否提供鏈接器當前需要的任何符號。如果是這樣,它將使用庫中的這些符號複製這些模塊,並將它們構建到程序中。當鏈接器看到一個對象模塊時,它會將該對象模塊構建到程序中。在將一個對象模塊帶入程序之後,鏈接器不會回頭查看它是否需要早期庫中的任何內容。

由於您首先列出了庫,鏈接器沒有從庫中看到它需要的任何內容。如果您首先列出目標模塊,鏈接器會將目標模塊放入程序中。在這樣做的過程中,鏈接器將列出對象所需的所有未定義符號。然後,當鏈接器看到這個庫時,它會看到這個庫爲這些符號提供了定義,並且它會將帶有這些符號的模塊帶入程序中。

+0

感謝Eric的解釋。我想我在命令的末尾使用'-lm'解決了這個問題。我不知道如何,但是我的數學庫鏈接在'/ usr/src/mathematics/math.h'中。我重建它到/usr/include/math.h它工作! – user2344169 2013-05-02 18:18:01

+0

@ user2344169在你的文章中,你不是說你已經試過了嗎? – 2015-05-15 20:34:04

+0

OP可能已經嘗試過,但這是我*需要的提示,謝謝。 – 2017-03-09 12:18:06

相關問題