私はCで簡単なフィボナッチ電卓を作成しようとしていますが、gcc
をコンパイルすると、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));
}
出力:
gab@testvm:~/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
次のように、リンクフラグ-lm
を使用してコンパイルする必要があります。
gcc fib.c -lm -o fibo
これは、数学ライブラリに対してコードをリンクするようにgccに指示します。フラグを必ず置いてくださいafterリンクしたいオブジェクト。
Pow()およびfloor()は数学ライブラリの一部であるため、リンクオプションに-lmを追加します。
gcc fib.c -o fibo -lm
後でこれを読んでいる人の利益のために、フレッドが言ったようにそれに対してリンクする必要があります:
gcc fib.c -lm -o fibo
リンクする必要のあるライブラリを見つけるための良い方法の1つは、manページが存在する場合はそれをチェックすることです。たとえば、man pow
とman floor
はどちらも次のことを示します。
-lm
とリンクします。
Cプログラミングで数学ライブラリをリンクするための説明- Linking in C
ファジーが提供する答えに関して:
私は実際に少し違うことをしなければなりませんでした。
プロジェクト->プロパティ-> C/C++ビルド->設定-> GCC Cリンカー->ライブラリ
小さな緑色の追加アイコンをクリックし、mと入力して[OK]を押します。このウィンドウはすべてライブラリであるため、自動的に-lが適用されます。
Eclipse-IDEで-lmを追加するポイントを見つけるのは本当に恐ろしいので、少し時間がかかりました。
他の人もEdlipseを使用している場合、コマンドを追加する方法は次のとおりです。
プロジェクト->プロパティ-> C/C++ビルド->設定-> GCC Cリンカー->その他->リンカーフラグ:このフィールドにコマンド-lmを追加します。