web-dev-qa-db-ja.com

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

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

max = (int) sqrt (number);

ヘッダーには次のものがあります:

#include <math.h>

しかし、アプリケーションはsqrtへの未定義の参照をまだ言っています。ここで何か問題がありますか?すべてが大丈夫なはずです。

55
Waypoint

使用しているシステムに関係なく、数学ライブラリとリンクする必要がある場合があります。

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

ヘッダーを含めると、コンパイラーは関数宣言について知ることができますが、notは、その関数の実行に必要なコードに必ず自動的にリンクします。

それに失敗すると、コード、コンパイルコマンド、実行しているプラ​​ットフォーム(オペレーティングシステム、コンパイラなど)を表示する必要があります。

次のコードはコンパイルしてリンクできます。

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

someコンパイルシステムは、コマンドラインで指定されたライブラリの順序に依存することに注意してください。つまり、ライブラリを順番に処理し、未解決のシンボルを満たすためにのみ使用することを意味します-シーケンスのその時点で

したがって、たとえば、次のコマンドが与えられた場合:

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

plugh.oにはxyzzyライブラリの何かが必要です。2番目のライブラリは期待どおりに動作しない可能性があります。ライブラリをリストする時点で、満たすべき未解決のシンボルはありません。

そして、plugh.odoからの未解決のシンボルが現れると、手遅れです。

86
paxdiablo

#include <math.h>でmath.hをインポートしたと思います

したがって、私が見ることができる唯一の他の理由は、リンク情報が欠落しているです。コードを-lmオプションにリンクする必要があります。

単にgccで1つのファイルをコンパイルしようとしている場合は、コマンドラインに-lmを追加するだけです。そうでない場合は、ビルドプロセスに関する情報を提供します。

24
krtek

最後にcソースファイルに#include <math.h>とMakefileに-lmを追加するだけで機能します。

    gcc -pthread -o p3 p3.c -lm
3
Hassan Rahman

ここに私の観察があります。まず、math.hヘッダーファイルで宣言されたsqrt()関数としてヘッダーmath.hを含める必要があります。例えば

#include <math.h>

第二に、 sqrt のマニュアルページを読むと、この行に気付くでしょう-lmでリンクします

#include <math.h> /* header file you need to include */

double sqrt(double x); /* prototype of sqrt() function */

Link with -lm. /* Library linking instruction */

しかし、アプリケーションはまだ未定義のsqrtへの参照を言っています。ここで何か問題がありますか?

プログラムをライブラリlmとリンクしていないため、コンパイラエラーは正しいです。リンカーはsqrt()の参照を見つけることができません。明示的にリンクする必要があります。例えば

gcc -Wall -Wextra -Werror -pedantic test.c -lm
1
Achal

私は同じ問題を抱えていましたが、コードを実行するコマンドの後に-lmを追加することで簡単に解決しました。例。 gcc code.c -lm

0
Mohamed Mnete