2013-05-02 8 views
6

私はmath.h-lmオプションを使ってコンパイルしています。"math.hとライブラリリンクであっても` pow 'への未定義参照-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' 

は、すべての場合に発生します。

+0

あなたは 'ssf_tb.c'のコードを投稿できますか? – higuaro

+0

'gcc -o -lm ssf -lm ssf_tb.c ssf.c' < - ' -lm'を2回持つことを意味しましたか? – Kevin

+2

これらの3つのコマンドラインのうち、最初のコマンドラインのみが動作するはずです。試してみましたか? –

答えて

17

-lmを行末に置きます。

gccは、コマンドラインに表示される順番で最終プログラムへの入力を指定する引数を処理します。 -lm引数がリンカーに渡され、たとえばssf.c引数がコンパイルされ、結果のオブジェクトファイルがリンカーに渡されます。

リンカは入力を順番に処理します。ライブラリには、-lmが指定されていると、そのライブラリに現在が必要なシンボルが含まれているかどうかが確認されます。そうであれば、ライブラリーからそれらのシンボルとともにモジュールをコピーし、それらをプログラムに組み込みます。リンカはオブジェクトモジュールを見ると、そのオブジェクトモジュールをプログラムに組み込みます。オブジェクトモジュールをプログラムに入れた後、リンカは元のライブラリから何も必要ないかどうかを確認しません。

ライブラリを最初にリストしたので、リンカーはライブラリから必要なものを見ませんでした。最初にオブジェクトモジュールをリストすると、リンカはオブジェクトモジュールをプログラムに持ち込みます。これを行う過程で、リンカーは、オブジェクトが必要とする未定義シンボルのリストを作成します。次に、リンカーがライブラリを見ると、ライブラリがそれらのシンボルの定義を提供していることがわかり、それらのシンボルを持つモジュールがプログラムに入ります。

+0

エリックの説明をありがとう。私は、コマンドの最後に '-lm'を使って問題を解決したと思います。私はどのようにしたらよいかわかりませんが、数学ライブラリへのリンクは '/ usr/src/mathematics/math.h'にあります。私は/usr/include/math.hにそれを再構築し、うまくいった! – user2344169

+0

@ user2344169あなたの投稿にあなたはあなたがすでにそれを試していたとは言わなかったのですか? –

+0

OPはすでにこれを試しているかもしれませんが、これは* I *が必要なヒントです。ありがとうございます。 –

関連する問題