3

次のコードは、Linux で未定義のシンボル エラーをスローしています。

$ cat rms.c
/* sqrt example */
#include <stdio.h>
#include <math.h>

int main ()
{
  double param, result;
  param = 1024.0;
  result = sqrt (param);
  printf ("sqrt(%lf) = %lf\n", param, result );
  return 0;
}


$ gcc rms.c
/tmp/ccaWecFP.o(.text+0x24): In function `main':
: undefined reference to `sqrt'
collect2: ld returned 1 exit status

sqrt() の引数を (double)16 に置き換えると、プログラムはコンパイルおよび実行されます。最初のケースでこのエラーがスローされるのはなぜですか。

4

5 に答える 5

4

これはリンカー エラーです。

リンカに の実装がありませんsqrt()。ライブラリに常駐しますlibm

オプションを適用して追加するように GCC に指示します-lm

于 2013-04-01T12:20:24.947 に答える
3

の実装は、数学ライブラリまたはsqrt()で利用できます。libm

次のように、プログラムを数学ライブラリにリンクする必要があります。

gcc rms.c -lm

自然な質問は、どうすればこれを知ることができるのでしょうか? 答えはマンページにあります。「man sqrt」を実行すると、次のように表示されます。リンク手順は概要に記載されていることに注意してください。

SYNOPSIS
       #include <math.h>

       double sqrt(double x);

       Link with -lm.
于 2013-04-01T12:29:01.957 に答える
2

他の回答が言うように、シンボル-lmを含むライブラリにリンクするには渡す必要があります。sqrt

定数引数で機能する理由sqrtは、組み込みとして実装できるためです。GCC は、定数引数で呼び出された組み込み関数を検出すると、ライブラリ内の外部関数への呼び出しを発行する代わりに、コンパイル時に結果を計算できます。

于 2015-07-01T01:42:44.247 に答える
2

とリンクする必要がありますlibm

gcc rms.c -lm

さらに説明が必要な場合外部ライブラリとのリンク

幸運を ;)

于 2013-04-01T12:20:48.397 に答える