web-dev-qa-db-ja.com

math.hヘッダーを含めても、「sqrtへの未定義の参照」エラーが発生するのはなぜですか?

私はCに非常に新しく、このコードを持っています:

#include <stdio.h>
#include <math.h>
int main(void)
{
  double x = 0.5;
  double result = sqrt(x);
  printf("The square root of %lf is %lf\n", x, result);
  return 0;
}

しかし、これを次のようにコンパイルすると:

gcc test.c -o test

次のようなエラーが表示されます。

/tmp/cc58XvyX.o: In function `main':
test.c:(.text+0x2f): undefined reference to `sqrt'
collect2: ld returned 1 exit status

なぜこれが起こるのですか? sqrt()math.hヘッダーファイルにありませんか? coshおよび他の三角関数でも同じエラーが発生します。どうして?

88
Ant's

実行可能ファイルをビルドするときは、数学ライブラリをリンクする必要があります。これを行う方法は環境によって異なりますが、Linux/Unixでは、コマンドに-lmを追加するだけです。

gcc test.c -o test -lm

数学ライブラリの名前はlibm.soであり、-lコマンドオプションはlibプレフィックスと.aまたは.soサフィックスを想定しています。

132
wallyk

-lmリンカーオプションとリンクする必要があります

としてコンパイルする必要があります

gcc test.c  -o test -lm

gcc(g ++ではありません)は、歴史的に、デフォルトではリンク時に数学関数を含みませんでした。また、libcから別のライブラリlibmに分離されました。これらの関数とリンクするには、ライブラリ-lリンカーオプションに続いてライブラリ名m、したがって-lmを含めるようにリンカーにアドバイスする必要があります。

21
Abhijit

これはおそらくリンカーエラーです。 -lmスイッチを追加して、それらの関数の定義を含む標準C数学ライブラリ(libm)にリンクすることを指定します(ヘッダーには、宣言があります-違いを調べる価値があります)。 )

7
ckhan

mathライブラリの場所をリンカに伝えなかったからです。 gcc test.c -o test -lmでコンパイルします

4
tuxuday

ヘッダーファイルmath.hをコードにリンクする必要があります。これを行うには、コマンドの後に-lmと入力します。

2
Dibyendu Saha

ヘッダーを追加:

#include<math.h>

注:abs()を使用してください。評価時にsqrt()が負の値をとることがあり、ドメインエラーが発生する場合があります。

abs()-絶対値を提供します。

例:abs(-3)= 3

コンパイル時にコマンドの最後に-lmを含めます。

gcc <filename.extension> -lm

1
Akshat