お知らせ

  • 利用規約を守って投稿してください。また、よくある質問および投稿の手引きも参照してください。
  • メッセージの投稿にはアカウントが必要です。未登録の方は、ユーザ登録ページからアカウントを作成することができます。

#1 2012-06-06 19:24:42

koma4607
新しいメンバ
登録日: 2012-02-10

math.h へのリンクがうまくいかない

はじめまして,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に与える変数を数字にするとコンパイルが通りました。しかし,変数にするとこのようなエラーが発生してしまいます.原因がなにか,どのようにすればよいのかご教授お願いします。

オフライン

 

#2 2012-06-06 19:50:40

koma4607
新しいメンバ
登録日: 2012-02-10

Re: math.h へのリンクがうまくいかない

$ 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' とでてしまいます.どうしてでしょうか.

オフライン

 

#3 2012-06-06 20:06:00

koma4607
新しいメンバ
登録日: 2012-02-10

Re: math.h へのリンクがうまくいかない

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と入力しましたらコンパイルを通りました.

オフライン

 

#4 2012-06-06 20:28:04

aaabbbcccdddeeefffggghhh
メンバ
登録日: 2008-02-25

Re: math.h へのリンクがうまくいかない

#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)

オフライン

 

#5 2012-06-06 20:33:26

aaabbbcccdddeeefffggghhh
メンバ
登録日: 2008-02-25

Re: math.h へのリンクがうまくいかない

all : $(SRC)
    $(CC) $(CFLAGS) -o $(DST) $(LDFLAGS) $(SRC)

問題の部分はここですね。
多分、

all : $(SRC)
    $(CC) -o $(DST) $(SRC) $(CFLAGS)  $(LDFLAGS)

とかにするとmakeできると思います。

オフライン

 

#6 2012-06-06 23:10:53

STGSAGWAN
メンバ
登録日: 2008-11-12

Re: math.h へのリンクがうまくいかない

koma4607さん、質問内容ですが、どこがどうUbuntuに関連しているのでしょうか?

このフォーラムって、「Ubuntuさえ使っていれば、プログラミングに関する事なんでも質問OK」という位置づけでよいのでしたっけ?>管理者の方。

オフライン

 

#7 2012-06-06 23:24:08

vbk
メンバ
From: Lake Hamana in Hamamatsu
登録日: 2009-12-22

Re: math.h へのリンクがうまくいかない

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 で確認しましたが、同様の現象は発生しませんでした。

オフライン

 

Board footer

Powered by FluxBB