プロが教えるわが家の防犯対策術!

math.hヘッダーをインクルードして、sqrt()やcos()の関数を使おうとすると、関数sqrt()は定義されていませんとエラーが出て正常にコンパイルできません。
他のヘッダー(stdio.hやstring.hやstdlib.h)の関数は正常に使えてますので、パスの設定は問題ないと思うのですが……
解決方法はあるのでしょうか?宜しくお願いします。

A 回答 (4件)

正確には、コンパイルできないのではなく、コンパイルしたオブジェクトをロード(オブジェクト間の依存関係を解決し、必要なライブラリを読み込んで実行モジュールを生成すること; リンクともいいます)するときに数学関数ライブラリを読み込んでいないために、関数の実体がないということでえらーになっています。



libcというデフォルトで読み込まれるライブラリには、数学関数が含まれていないのが普通です。ロード時に読み込んでもらうよう明示的に書く必要があります。

ldまたはccのコマンドラインに -lm というオプションを記述することで、数学関数ライブラリ(libm)を読み込ませることができます。
    • good
    • 0
この回答へのお礼

 返事遅れてすいません。
 詳しい説明ありがとうございます。オプション-lmを付けないと数学関数はリンクする時に読み込まれないのですね。
 ありがとうございました。

お礼日時:2004/05/26 23:49

#2です。



#3さんの回答のとおりの可能性もありますが、エラーメッセージが

undefined reference to `sqrt'

というものであれば、ロード(リンク)時のエラーです。

私のところでは、 glibc2の環境ですが、-lm をつけないと上記のエラーがでます。
    • good
    • 0
この回答へのお礼

 何度も返事ありがとうございます。
出ていたのはまさしくこのメッセージでした。
リンク時のエラーのようで-lmを付けることによりで解決できました。
 ありがとうございました。

お礼日時:2004/05/26 23:54

お名前から想像するに、Linux ですか。


>>関数sqrt()は定義されていません...
のエラーは、コンパイル時ですか、リンク時ですか。
リンク時なら、これまでの回答で良いかも知れません。
(但し、-lm が Linux でも通る?)
コンパイル時のエラーなら、stdio.h などの並びの math.h を
開いて、使用する関数があるか見てください。
  多分、更に他の header file を見ているのでは。
関数の prototype がなければ、再度インストールが必要です。
    • good
    • 0
この回答へのお礼

返事ありがとうございます。
 1と2の方の方法で解決できたので、リンク時のエラーのようでした。Linuxですが-lmも通り、無事に動きました。
 ありがとうございました。

お礼日時:2004/05/26 23:52

オブジェクトファイルがリンクされていないのでは?コンパイル時に -lm をつけてみたらどうでしょうか?



例)
> cc main.c -lm
    • good
    • 0
この回答へのお礼

返事遅れてすいません。
先ほど、-lmオプションをつけて試してみましたが、
動作しました。ご指摘の通り、リンクされていなかったようです。ありがとうございました。

お礼日時:2004/05/26 23:46

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています