2011-12-29 7 views
100

私は単純なフィボナッチ計算機をC言語で作成しようとしていますが、コンパイル時にはgccはpowとfloor関数がありません。どうしましたか?`pow 'と` floor'への未定義の参照

コード:

#include <stdio.h> 
#include <math.h> 

int fibo(int n); 

int main() { 
     printf("Fib(4) = %d", fibo(4)); 
     return 0; 
} 

int fibo(int n) { 
     double phi = 1.61803399; 

     return (int)(floor((float)(pow(phi, n)/sqrt(5)) + .5f)); 
} 

出力:これはと照らし合わせてコードをリンクするためにはgccを教えてくれます

gcc fib.c -lm -o fibo 

[email protected]:~/work/c/fibo$ gcc fib.c -o fibo 
/tmp/ccNSjm4q.o: In function `fibo': 
fib.c:(.text+0x4a): undefined reference to `pow' 
fib.c:(.text+0x68): undefined reference to `floor' 
collect2: ld returned 1 exit status 
+0

浮動小数点精度は無限ではないので、これは 'n 'の値がそれほど大きくないために間違った答えを与えるでしょう – vonbrand

答えて

194

あなたはこのように、フラグ-lmを使用してコンパイルする必要があります数学のlib。の後に、フラグを必ず挿入して、リンクしたいオブジェクトを入れてください。 EclipseベースのIDEで-lmを追加するポイントを見つけるには

gcc fib.c -o fibo -lm 
+6

-lの後に置く手紙をどのように作り上げるべきか説明してください。 –

+41

/libまたは/ usr/libを参照してください。ライブラリはすべて 'lib .a'または' lib .so'という名前で、 '-l'の後に置かれた" "です。この場合、数学ライブラリの名前は 'libm.so'なので、' -lm'と呼んでいます。 – ams

+3

ありがとう!私は過去30分間のグーグル・グーグルで、これはオブジェクトの後にライブラリをリンクすると言った最初のリファレンスです –

24

、あなたのリンクオプションに-lm追加恐ろしいので、時間がかかりました。

他の誰かもEdlipseを使用している場合は、ここにコマンドを追加する方法方法です:

プロジェクト - >プロパティ - > C/C++ビルド - >設定 - > GCC Cリンカ - > Miscelleaneous - >リンカフラグ:このフィールドにあいまいで提供さ答えに関しては、コマンド-lm

6

が本当にある:POW()と床が()数学ライブラリの一部であるため、

8

を追加します。

私は実際にはわずかに異なる何かをしなければなりませんでした。

プロジェクト - >プロパティ - > C/C++ビルド - >設定 - > GCC Cリンカ - >ライブラリ

、小さな緑の追加アイコンをクリックしてタイプMし、[OK]を押します。このウィンドウ内のすべては、ライブラリであるため自動的に-l適用されます。これを読んで、誰の利益のために

9

フレッドが言ったように、後に、あなたはそれとリンクする必要があります。

gccのfib.c -lm -oはあなたが必要なものをライブラリーを見つけるために

一つの良い方法をFIBOリンクするには、マニュアルページが存在する場合はそれを調べます。たとえば、「man pow」と「man floor」の両方があなたに伝えます:

-lmとリンクします。

関連する問題