2

少しのコードがあります:

#include <math.h>

int main(void){
    pow(2.0,7.0);
    //Works

    double x = 3.0;
    pow(2.0,x);
    //Fails with error "undefined reference to 'pow'"
    return 0;
}

-lmEclipse コンパイラ設定にリンクしました: gcc -O0 -g3 -Wall -lm -c -fmessage-length=0 -MMD -MP -MF"src/pgm.d" -MT"src/pgm.d" -o "src/pgm.o" "../src/pgm.c"、エラーの原因がわかりません。私は何をしていないのですか?

4

3 に答える 3

8

コマンドラインの入力ソースに従う必要があるため、オプションは機能しませ-lmん。

コマンドのどこにこのオプションを記述するかによって違いが生じます。リンカーは、指定された順序でライブラリとオブジェクト ファイルを検索して処理します。したがって、foo.o -lz bar.oライブラリzは file の後、 のfoo.o前に検索されますbar.obar.oで関数を参照している場合z、それらの関数がロードされていない可能性があります。

最初の式は、コンパイラによって定数式として評価され、実行時にpow(2.0,7.0)必要ないため機能します。pow

于 2013-05-28T22:10:48.873 に答える
0

コンパイラの -lm フラグを使用して数学ライブラリにリンクする必要があります。

最初の例は、コンパイラが値をインライン化できるため (実際には、2^7 は常に 128 に等しい) 動作しますが、変数パラメーターを pow() に使用する場合、その値はインライン化できません。したがって、値をインライン化する代わりに、関数を呼び出す標準数学ライブラリを明示的にリンクする必要があります。

于 2013-05-29T16:35:33.427 に答える