137

私は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なんで?

4

5 に答える 5

212

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

gcc test.c -o test -lm

数学ライブラリの名前libm.soは で、コマンド オプションは接頭辞または接尾辞を-l想定しています。lib.a.so

于 2012-05-02T06:55:27.340 に答える
34

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

次のようにコンパイルする必要があります

gcc test.c  -o test -lm

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

于 2012-05-02T06:55:11.787 に答える
11

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

于 2012-05-02T06:55:38.743 に答える
6

リンカに数学ライブラリの場所を伝えていないためです。gcc test.c -o test -lmでコンパイル

于 2012-05-02T06:56:11.923 に答える