私は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
および他の三角関数でも同じエラーが発生します。どうして?
実行可能ファイルをビルドするときは、数学ライブラリをリンクする必要があります。これを行う方法は環境によって異なりますが、Linux/Unixでは、コマンドに-lm
を追加するだけです。
gcc test.c -o test -lm
数学ライブラリの名前はlibm.so
であり、-l
コマンドオプションはlib
プレフィックスと.a
または.so
サフィックスを想定しています。
-lm
リンカーオプションとリンクする必要があります
としてコンパイルする必要があります
gcc test.c -o test -lm
gcc(g ++ではありません)は、歴史的に、デフォルトではリンク時に数学関数を含みませんでした。また、libcから別のライブラリlibmに分離されました。これらの関数とリンクするには、ライブラリ-l
リンカーオプションに続いてライブラリ名m
、したがって-lm
を含めるようにリンカーにアドバイスする必要があります。
これはおそらくリンカーエラーです。 -lm
スイッチを追加して、それらの関数の定義を含む標準C数学ライブラリ(libm
)にリンクすることを指定します(ヘッダーには、宣言があります-違いを調べる価値があります)。 )
mathライブラリの場所をリンカに伝えなかったからです。 gcc test.c -o test -lmでコンパイルします
ヘッダーファイルmath.h
をコードにリンクする必要があります。これを行うには、コマンドの後に-lm
と入力します。
ヘッダーを追加:
#include<math.h>
注:abs()を使用してください。評価時にsqrt()が負の値をとることがあり、ドメインエラーが発生する場合があります。
abs()-絶対値を提供します。
例:abs(-3)= 3
コンパイル時にコマンドの最後に-lmを含めます。
gcc <filename.extension> -lm