2012-05-02 3 views
62

私はCに非常に新しいだと私はこのコードを持っている:math.hヘッダーをインクルードしても、「未定義のsqrtへの参照」エラーが発生するのはなぜですか?

#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と他の三角関数で同じエラーが発生します。どうして?

+1

なぜ、 'libm'に標準ライブラリの一部が含まれていても、なぜデフォルトでリンクされていないのか、いくつかの推測があります:http://stackoverflow.com/questions/1033898/why-do-you-have-ライブラリへのリンクライブラリ –

+0

これは複製です:http://stackoverflow.com/q/5248919/694576 – alk

答えて

102

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

gcc test.c -o test -lm 

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

17

あなたがリンクしながら、歴史的に、デフォルトで数学関数が含まれていないでしょうあなたは

gcc test.c -o test -lm 

のgcc(未G ++)としてコンパイルする必要があり-lmリンカオプション

とリンクする必要があります。また、libcから別のライブラリlibmにも分離されています。これらの関数にリンクするには、リンカーにライブラリ-lリンカーオプションを含めるようにリンカーに助言し、ライブラリ名m、したがって-lmを指定する必要があります。

7

これはおそらくリンカエラーです。 は、これらの関数の定義を持っているあなたは、標準C数学ライブラリにリンクするように指定する-lmスイッチ(libm)を追加します(ヘッダーがちょうど彼らのために宣言ている - 。違いを調べる価値を)

4

数学ライブラリの場所についてリンカーに伝えていないので。追加のGCC test.cの-o試験-lm

1

でコンパイルヘッダ:

#include<math.h>

注:時々評価SQRT()の時に使用ABS()は、負の値をとることができますドメインエラーにしてください。

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

たとえば、ABS(-3)= 3

は、コンパイル時間中に、コマンドの最後に-lmを含める:

gcc <filename.extension> -lm

3

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

関連する問題