sqrt()関数変数引数で動作しない[複製
-
30-09-2019 - |
質問
この質問にはすでに答えがあります:
明白なものが足りないかどうかはわかりませんが、の平方根を計算できないようです 変数 cで; SQRT()関数は、定数でのみ動作しているようです。これは私のコードです:
#include <math.h>
#include <stdio.h>
int main()
{
double a = 2.0;
double b = sqrt(a);
printf("%f", b);
return 0;
}
このプログラムを実行すると、次のエラーが発生します。
gcc -Wall -o "test2" "test2.c" (in directory: /home/eddy/Code/euler)
/tmp/ccVfxkNh.o: In function `main':
test2.c:(.text+0x30): undefined reference to `sqrt'
collect2: ld returned 1 exit status
Compilation failed.
ただし、sqrt()の引数を2.0などの定数に置き換えると(たとえば)(b = sqrt(2.0)
)、それは正常に動作します。 SQRT()は変数などで動作するはずですか?
助けてくれてありがとう
解決
数学ライブラリにリンクする必要があります(コマンドラインで「-LM」を使用してください)。一定のケースでは、コンパイラはおそらくスマートであり、SQRT(2.0)を事前に計算しています(したがって、コンパイルされたコードは本質的に「b = 1.414 ...; ')です。
他のヒント
おそらく追加する必要があります -lm
コンパイルするとき。定数の平方根を取ると、コンパイラはコンパイル中に四角いルートを取ることでコードを最適化しているので、使用しません sqrt
まったく。
コマンドを使用します gcc -Wall -o "test2" "test2.c" -lm
これはおそらくこれを修正するでしょう。
これには、標準のCランタイムライブラリに加えて数学ライブラリが含まれます。ほとんどのシステムでは、数学ライブラリは歴史的に明示的に要求する必要がある別のエンティティです。
GCCの場合、ライブラリをリンクする必要があります。
gcc filename.c -lm。
ただし、G ++の場合、ライブラリをリンクする必要がないため、これは正常に機能します。
g ++ filename.c -o filenameコンピレーションが成功した場合。
実行するには、G ++に./FileNameを入力するだけです。 GCCに./a.outを入力します。
コンパイル:
gcc -Wall -o test2 test2.c -lm
数学ライブラリに対してリンクする必要があります。
「」オペレーターを使用して数学ライブラリを含めます
#include " math.h "
使用してプログラムをコンパイルします -lm
数学ライブラリを継承するオプションプログラム名が test.c
次のようにコンパイルします
gcc test.c -lm
GCCは、デフォルトで標準ライブラリをリンクしません。したがって、GCCを介してコンパイルする場合は、これを行う必要があります。
gcc filename.c -lm .
ただし、G ++の場合、ライブラリをリンクする必要がないため、これは正常に機能します。
g ++ filename.c -o filename
これは私にとってうまくいきます。数学ライブラリには問題があると思います。もう一度リンクしてみてください。他の賢明なコードは完全に完璧です。