我正在使用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'
發生在所有的情況下。
我正在使用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'
發生在所有的情況下。
將-lm
放在行末。
gcc處理指定輸入到最終程序的參數,它們按它們在命令行上的顯示順序排列。 -lm
參數被傳遞給鏈接器,例如ssf.c
參數被編譯,並且生成的目標文件被傳遞給鏈接器。
鏈接器也按順序處理輸入。當它看到一個庫時,如-lm
指定,它會查看該庫是否提供鏈接器當前需要的任何符號。如果是這樣,它將使用庫中的這些符號複製這些模塊,並將它們構建到程序中。當鏈接器看到一個對象模塊時,它會將該對象模塊構建到程序中。在將一個對象模塊帶入程序之後,鏈接器不會回頭查看它是否需要早期庫中的任何內容。
由於您首先列出了庫,鏈接器沒有從庫中看到它需要的任何內容。如果您首先列出目標模塊,鏈接器會將目標模塊放入程序中。在這樣做的過程中,鏈接器將列出對象所需的所有未定義符號。然後,當鏈接器看到這個庫時,它會看到這個庫爲這些符號提供了定義,並且它會將帶有這些符號的模塊帶入程序中。
感謝Eric的解釋。我想我在命令的末尾使用'-lm'解決了這個問題。我不知道如何,但是我的數學庫鏈接在'/ usr/src/mathematics/math.h'中。我重建它到/usr/include/math.h它工作! – user2344169 2013-05-02 18:18:01
@ user2344169在你的文章中,你不是說你已經試過了嗎? – 2015-05-15 20:34:04
OP可能已經嘗試過,但這是我*需要的提示,謝謝。 – 2017-03-09 12:18:06
你可以發佈'ssf_tb.c'的代碼嗎? – higuaro 2013-05-02 17:47:36
'gcc -o -lm ssf -lm ssf_tb.c ssf.c' < - 你的意思是讓'-lm'兩次? – Kevin 2013-05-02 17:48:15
在這3條命令行中只有第一條應該起作用。你確定你試過嗎? – 2013-05-02 17:48:44