
Ubuntu日本語フォーラム
ログインしていません。
はじめまして,Ubuntuの初心者です.このようなC言語プログラムを作りました.
#include <stdio.h>
#include <math.h>
int main(void)
{
double x,t,u;
int j=5;
x=(double)j;
t=sqrt(x);
u=sin(x);
printf("%f %f \n",t,u);
return 0;
}
これを
$ gcc -lm tt.c
/tmp/ccc7hJAw.o: In function `main':
tt.c.text+0x35): undefined reference to `sqrt'
tt.c.text+0x45): undefined reference to `sin'
collect2: ld はステータス 1 で終了しました
のようにコンパイルするとエラーが発生してしまいます.これはmath.hへのリンクがはられてないときに起こるということなので,-lm をつけてコンパイルしたのですがダメでした.
さらにsqrt,sinに与える変数を数字にするとコンパイルが通りました。しかし,変数にするとこのようなエラーが発生してしまいます.原因がなにか,どのようにすればよいのかご教授お願いします。
オフライン
$ gcc tt.c -lm
にしたらコンパイルが通りました。
しかしMakefileは未だに通ってくれません
# コンパイラはgccを使う ( 絶対に変更しないこと! )
CC = gcc
# ソースファイル名 ( コンパイルしたいソース.cを全て書くこと )
SRC = tt.c
# 実行ファイル名 ( 必要に応じて変更すること )
DST = tt
# コンパイルオプション ( 絶対に変更しないこと! )
CFLAGS = -Wall -ansi -pedantic-errors
# リンクするライブラリ ( 必要に応じて変更すること )
LDFLAGS = -lm
.PHONY : all clean
# make all
all : $(SRC)
$(CC) $(CFLAGS) -o $(DST) $(LDFLAGS) $(SRC)
@ echo "↑に何も出力されていなければコンパイルは成功です."
@ echo "Error, Warningがなくなるまでプログラムを修正してください."
@ echo "コンパイル時のError, Warningが1つもなくなったら動作を確認し,"
@ echo "目的の動作を実現できているなら提出して下さい."
# make clean
clean :
\rm -f $(DST) *.bak *~
というのを使っているのですが,undefined reference to `sqrt' とでてしまいます.どうしてでしょうか.
オフライン
make 使用時のを載せます
$ make
gcc -Wall -ansi -pedantic-errors -o tt -lm tt.c
/tmp/ccbBNEKx.o: In function `main':
tt.c:(.text+0x21): undefined reference to `sqrt'
tt.c:(.text+0x31): undefined reference to `sin'
collect2: ld はステータス 1 で終了しました
make: *** [all] エラー 1
gcc -Wall -ansi -pedantic-errors -o tt -lm tt.c のようにコンソールには表示されますこれが
gcc -Wall -ansi -pedantic-errors -o tt tt.c -lm ならコンパイルを通る可能性があると思います.
この後 直接 gcc -Wall -ansi -pedantic-errors -o tt tt.c -lmと入力しましたらコンパイルを通りました.
オフライン
#2の内容を弄ったらmake出来ましたよ。
# minizipのmakeファイルを参考にしました # コンパイラはgccを使う ( 絶対に変更しないこと! ) CC = gcc # ソースファイル名 ( コンパイルしたいソース.cを全て書くこと ) SRC = tt.c # 実行ファイル名 ( 必要に応じて変更すること ) DST = tt # コンパイルオプション ( 絶対に変更しないこと! ) CFLAGS = -Wall -ansi -pedantic-errors # リンクするライブラリ ( 必要に応じて変更すること ) LDFLAGS = -lm all : tt tt: $(SRC) $(CC) -o $@ $(SRC) $(CFLAGS) $(LDFLAGS)
オフライン
all : $(SRC)
$(CC) $(CFLAGS) -o $(DST) $(LDFLAGS) $(SRC)
問題の部分はここですね。
多分、
all : $(SRC)
$(CC) -o $(DST) $(SRC) $(CFLAGS) $(LDFLAGS)
とかにするとmakeできると思います。
オフライン
koma4607さん、質問内容ですが、どこがどうUbuntuに関連しているのでしょうか?
このフォーラムって、「Ubuntuさえ使っていれば、プログラミングに関する事なんでも質問OK」という位置づけでよいのでしたっけ?>管理者の方。
Ubuntu 11.04以降、リンク時に--as-neededオプションがデフォルトで有効化されているため、リンクオプションを適切な位置に入れないとエラーが発生します。
https://lists.ubuntu.com/archives/ubuntu-devel/2010-November/031991.html
gcc に -Wl,--no-as-needed を付加することで、エラーを回避できます。
一応 Ubuntu の gcc-4.4 及び、Debian の gcc-4.6,4.7 で確認しましたが、同様の現象は発生しませんでした。
オフライン