2012-01-26 52 views
1

可能重複:
Problem using pow() in C
Undefined reference to pow' andfloor'未定義的引用錯誤

我用gcc 4.6.1。

代碼片段:

int main(void) 
{ 

int x= 2; 
int y = pow(3,x); 
printf("%d\n",y); 

return 0; 
} 

終端:

[email protected]:~/Desktop/DSF$ gcc power.c -o power 
/tmp/ccTJ7vAH.o: In function `main': 

power.c:(.text+0x25): undefined reference to `pow' 
collect2: ld returned 1 exit status 

如果我更換由2×那麼它就會以預期的方式執行。 pow函數不接受變量,因爲它的參數?

注意:我在源文件中包含了stdio.h和math.h。

+0

如果你有pow(3,2),編譯器可以直接計算出來,而不必調用該函數。 –

+0

如果您在源文件中包含stdio.h和math.h,那麼向我們展示在代碼中,而不是向我們展示不完整的代碼,然後告訴我們缺少什麼。 –

+0

@基思湯普森 - 對不起。但是「包含」一詞似乎是粗體而沒有真正去大膽的類型。所以我放棄了#include這幾行,但是我已經提到過我已經將這兩個庫都包括在內了。 –

回答

8

您需要添加-lm命令行開關在數學庫鏈接(-l...的意思是「在_ _庫鏈接」; m是數學庫):

gcc power.c -lm -o power 
+2

或者更確切地說'gcc power.c -lm -o power'。 lib必須在源文件之後。 –

+0

這不是參數的正確順序。見http://stackoverflow.com/questions/45135/linker-order-gcc –

+0

@ ruakh-沒有變化。得到了同樣的錯誤信息。 –

1

戰俘函數是數學庫的一部分。因此,你的編譯器的invokation應該如下:

gcc power.c -o power -lm 

哪裏-lm是指示執行與系統上的數學庫鏈接鏈接器開關。

+0

@丹尼爾 - 它的工作!但是我可以知道爲什麼我需要添加swith(-lm)嗎? 2)如果所有關於鏈接庫,那麼當我用任何常量no替換x時爲什麼它會被執行?3)爲什麼我不需要添加這個swith來連接像stdio.h這樣的其他庫? –

+0

'gcc'總是隱式地將源與標準C庫鏈接起來。很顯然,你用C語言編程,所以你最有可能會使用這個庫,所以每次在命令行添加一個額外的-lc就會很奇怪。如果用一個常量替換'x',編譯器 - 知道pow函數做了什麼 - 將它變成一個常量,並避免在運行時調用該函數。 –

+0

@ Daniel-那麼你的意思是math.h不是stdio.h標準C庫的一部分嗎? –