私はこの簡単なコードを持っています:
max = (int) sqrt (number);
ヘッダーには次のものがあります:
#include <math.h>
しかし、アプリケーションはsqrt
への未定義の参照をまだ言っています。ここで何か問題がありますか?すべてが大丈夫なはずです。
使用しているシステムに関係なく、数学ライブラリとリンクする必要がある場合があります。
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.o
doからの未解決のシンボルが現れると、手遅れです。
#include <math.h>
でmath.hをインポートしたと思います
したがって、私が見ることができる唯一の他の理由は、リンク情報が欠落しているです。コードを-lm
オプションにリンクする必要があります。
単にgccで1つのファイルをコンパイルしようとしている場合は、コマンドラインに-lm
を追加するだけです。そうでない場合は、ビルドプロセスに関する情報を提供します。
最後にcソースファイルに#include <math.h>
とMakefileに-lmを追加するだけで機能します。
gcc -pthread -o p3 p3.c -lm
ここに私の観察があります。まず、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
私は同じ問題を抱えていましたが、コードを実行するコマンドの後に-lmを追加することで簡単に解決しました。例。 gcc code.c -lm