私が使用math.h
しているのは、-lm
コンパイルするオプションです。私はすべてを試しました:
gcc -o ssf ssf_tb.c ssf.c -lm
gcc -o ssf ssf_tb.c -lm ssf.c
gcc -o -lm ssf -lm ssf_tb.c ssf.c
しかし、エラー:
undefined reference to 'pow'
すべてのケースで発生します。
-lm
を行末に置きます。
gcc は、最終的なプログラムへの入力を指定する引数をコマンド ラインに表示される順序で処理します。-lm
引数はリンカーに渡され、たとえばssf.c
、引数がコンパイルされ、結果のオブジェクト ファイルがリンカーに渡されます。
また、リンカは入力を順番に処理します。指定されたライブラリを確認すると、そのライブラリがリンカが現在必要としている-lm
シンボルを提供しているかどうかを確認します。その場合、ライブラリからそれらのシンボルを含むモジュールをコピーし、それらをプログラムにビルドします。リンカーは、オブジェクト モジュールを検出すると、そのオブジェクト モジュールをプログラムに組み込みます。オブジェクト モジュールをプログラムに取り込んだ後、リンカは戻って以前のライブラリから何かが必要かどうかを確認しません。
ライブラリを最初にリストしたため、リンカーはライブラリから必要なものを何も認識しませんでした。オブジェクト モジュールを最初にリストすると、リンカーはオブジェクト モジュールをプログラムに取り込みます。これを行う過程で、リンカーは、オブジェクトが必要とするすべての未定義シンボルのリストを作成します。次に、リンカーがライブラリを確認すると、ライブラリがそれらのシンボルの定義を提供していることを確認し、それらのシンボルを含むモジュールをプログラムに取り込みます。