こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

<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>を使用しないプログラムは普通に動作します。
解決方法をご存知の方がいらっしゃいましたらご教授下さいませ。
よろしくお願いします。

投稿日時 - 2005-11-18 00:04:43

QNo.1785780

すぐに回答ほしいです

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

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

投稿日時 - 2005-11-18 00:06:47

お礼

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

投稿日時 - 2005-11-21 17:29:35

このQ&Aは役に立ちましたか?

14人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.3

> collect2: ld はステータス 1 で終了しました
このメッセージから、問題点はコンパイル(リンク)時のコマンドの与え方にあることがわかります。

ccでコンパイルしてるなら-lmを直接指定、makeを使ってるならLDFLAGSに-lmを追加ですね。
できれば、ソースだけでなくコンパイル時のコマンドラインも示していただけると具体的なアドバイスがしやすい。
makefileを使ってるならmakefileも。

投稿日時 - 2005-11-18 21:05:23

お礼

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

投稿日時 - 2005-11-21 17:28:46

ANo.2

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

投稿日時 - 2005-11-18 00:58:54

お礼

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

投稿日時 - 2005-11-21 17:29:12