• ベストアンサー

<math.h>があるのにsqrtが・・・

最初にあるプログラムを作っていたのですが、その祭sqrtでエラーが出てしまったので、別にsqrtを使う短いプログラムを作りました。それが以下のものになります。(test3.c) 「 #include<stdio.h> #include<math.h> int main(void){ int atai; double x=2.0; atai=(int)sqrt(x); printf("atai is %c",atai); } 」 sqrtが動作するか確かめる為のものです。このプログラム(test3.c)で以下のエラーが出てしまいました。 「 /tmp/ccqEejZ1.o(.text+0x4d): In function `main': test3.c: undefined reference to `sqrt' collect2: ld はステータス 1 で終了しました 」 ちなみにLinux(Fedora core 4)を使用しています。 初心者ということもありなぜエラーが出るのか分かりません。 ちなみに<math.h>を使用しないプログラムは普通に動作します。 解決方法をご存知の方がいらっしゃいましたらご教授下さいませ。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

コンパイルのオプションつけてないとかないですよね? たとえばTerminalとかだとコンパイル時に 『-lm』とかつけますが

katayakise
質問者

お礼

ありがとうございました。皆様のご指摘どおり、コンパイル時に-lmをつけるのを忘れておりました。

その他の回答 (2)

  • toysmith
  • ベストアンサー率37% (570/1525)
回答No.3

> collect2: ld はステータス 1 で終了しました このメッセージから、問題点はコンパイル(リンク)時のコマンドの与え方にあることがわかります。 ccでコンパイルしてるなら-lmを直接指定、makeを使ってるならLDFLAGSに-lmを追加ですね。 できれば、ソースだけでなくコンパイル時のコマンドラインも示していただけると具体的なアドバイスがしやすい。 makefileを使ってるならmakefileも。

katayakise
質問者

お礼

ありがとうございました。皆様のご指摘どおり、コンパイル時に-lmをつけるのを忘れておりました。

  • notnot
  • ベストアンサー率47% (4901/10362)
回答No.2

printfやgetcharのようなどのプログラムでも使われるような標準的な関数は何も指定しなくていいのですが、算術関数は、どのプログラムでも使うわけじゃないし、関数サイズが大きいため、libmという別ファイルに入ってます。 コンパイルの次のリンクという作業で、sqrt() や sin()等のサブルーチンが入っているlibmから取ってくるために、cc コマンドに -lm (linkの時にlibmも探しなさい)というオプションをつける必要があります。

katayakise
質問者

お礼

ありがとうございました。皆様のご指摘どおり、コンパイル時に-lmをつけるのを忘れておりました。

関連するQ&A