web-dev-qa-db-ja.com

「pow」および「floor」への未定義の参照

私は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));
}

出力:

[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
110

次のように、リンクフラグ-lmを使用してコンパイルする必要があります。

gcc fib.c -lm -o fibo

これは、数学ライブラリに対してコードをリンクするようにgccに指示します。フラグを必ず置いてくださいafterリンクしたいオブジェクト。

220
Fred

Pow()およびfloor()は数学ライブラリの一部であるため、リンクオプションに-lmを追加します。

gcc fib.c -o fibo -lm
24
Yann Droneaud

後でこれを読んでいる人の利益のために、フレッドが言ったようにそれに対してリンクする必要があります:

gcc fib.c -lm -o fibo

リンクする必要のあるライブラリを見つけるための良い方法の1つは、manページが存在する場合はそれをチェックすることです。たとえば、man powman floorはどちらも次のことを示します。

-lmとリンクします。

Cプログラミングで数学ライブラリをリンクするための説明- Linking in C

9
spike.barnett

ファジーが提供する答えに関して:

私は実際に少し違うことをしなければなりませんでした。

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

小さな緑色の追加アイコンをクリックし、mと入力して[OK]を押します。このウィンドウはすべてライブラリであるため、自動的に-lが適用されます。

8
Greg K

Eclipse-IDEで-lmを追加するポイントを見つけるのは本当に恐ろしいので、少し時間がかかりました。

他の人もEdlipseを使用している場合、コマンドを追加する方法は次のとおりです。

プロジェクト->プロパティ-> C/C++ビルド->設定-> GCC Cリンカー->その他->リンカーフラグ:このフィールドにコマンド-lmを追加します。

6
Fuzzy