1. ホーム
  2. c

sqrt(またはその他の数学関数)への未定義の参照

2023-08-26 15:29:44

質問

私はこの簡単なコードを持っています。

max = (int) sqrt (number);

で、ヘッダーには

#include <math.h>

への参照は未定義であると表示されます。 sqrt . 何か問題があるのでしょうか?それはすべてが大丈夫であるように見えます。

どのように解決するのですか?

あなたが使っているシステムの数学ライブラリとリンクする必要があることに気づくかもしれません、次のような。

gcc -o myprog myprog.c -L/path/to/libs -lm
                                       ^^^ - this bit here.

ヘッダを含むことで、コンパイラは関数宣言を知ることができますが、それは ではなく 必ずしもその関数を実行するために必要なコードに自動的にリンクするわけではありません。

そうでない場合は、あなたのコード、コンパイルコマンド、実行中のプラットフォーム (オペレーティングシステム、コンパイラなど) を示す必要があります。

次のコードは、正常にコンパイルおよびリンクされます。

#include <math.h>
int main (void) {
    int max = sqrt (9);
    return 0;
}


ただ、注意していただきたいのは いくつかの コンパイルシステムは、ライブラリがコマンドラインで与えられた順番に依存します。つまり、ライブラリを順番に処理し、未解決のシンボルを満たすためにのみライブラリを使用する場合があるということです。 を満たすためにのみ使用します。

では、例えば、コマンドが与えられた場合。

gcc -o plugh plugh.o -lxyzzy
gcc -o plugh -lxyzzy plugh.o

plugh.o には何かが必要です。 xyzzy ライブラリの何かを必要とする場合、2 番目は期待通りに動作しないかもしれません。ライブラリをリストアップした時点では、満たすべき未解決のシンボルは存在しません。

そして、未解決のシンボルが plugh.o を実行します。 が現れると、もう手遅れです。