math.hを使うには(未解決)

Posted at 06/08/03 Comment(4)»

今まで私はgccをあまり使ったことはありません。math.hなどのシステムライブラリもあまり使ったことがありません。H8/TinyやR8CではROMやRAMがあまりないのでそもそもライブラリを使うということが選択肢に入りませんでしたし、画像処理や計算歩行などはやっていなかったのでmath.hにあるような関数自体も必要ではありませんでした。しかし今回はAMR7TDMIをコアに持つ大容量高速なLPC2138を使用しているわけですからこれを使わない手はありません。

今回math.hを使うにはどうしたらよいかを調べたのでメモしておきたいと思います。とはいってもまだ正常に動作していませんが・・・。

まずgccでmath.hに含まれる関数を使用するにはnewlibと呼ばれるライブラリをインストールしておく必要があるらしいのですがこれはTeamKNOxさんのところに書いてある手順でGCCをインストールすると既にインストールされているようです。OptimaizeさんのHPで紹介されているCygwinベースのGCCでも勝手にインストールしてくれるようです。

次にmath.hを使用したファイルに#include <math.h>を追加してmath.hのライブラリであるlibm.aをリンクするオプション-lmをmakefileに追加するのですが問題なのは追加するその場所です。TeamKNOxさんのmakefileを見るとLIBSという記述が見受けられますので単純にここに入れればよいのかと思われましたがundefined reference to `sqrt'のような感じでエラーとなってしまいます。

$(CC) $(CFLAGS) $(LDFLAGS) $(LIBS) $(OBJ)  -o $@

となっている部分を

$(CC) $(CFLAGS) $(LDFLAGS)  $(OBJ) $(LIBS) -o $@

と$(OBJ) と$(LIBS)の位置を入れ替えてあげることでエラーを回避できるようになりました。よくわかりませんが-lmはとにかく後ろの方につかないといけないようです。

これでコンパイルはエラーなしに通るようになりましたが、できたバイナリが正常に動作しません(泣)。libm.aが正常にリンクされていないのではないかと思いましたが、C:\GNUARM\arm-elf\libの中のlibm.aをリネームしてみるとエラーがでるので違うようです。

うーん、仕方がないので自前で必要な関数を用意することにしますか。まず確認でってやるとつまづいてばかりでちょっと悲しくなります。

"math.hを使うには(未解決)"へのコメント

CommentData » Posted by 森 秀樹 at 06/08/03

LPC2138てFPUを持っていたでしょうか?
もし無いとすると、soft-flotライブラリを使う必要があると思います。
どうやって指定するかわかりませんが、gccのアセンブリアウトを出力させてfpu命令が入っていて、LPC2138がサポートしてなければ動かないと思います。

CommentData » Posted by りおーじあ at 06/08/03

森 秀樹さん、こんばんは。
コメントありがとうございます。

>LPC2138てFPUを持っていたでしょうか?
もし無いとすると、soft-flotライブラリを使う必要があると思います。

LPC2138はFPUはなかったと思います。
soft-floatですね。試してみたいと思います。

アドバイスありがとうございます。
また、何かあれば是非よろしくお願いします。

それでは。

CommentData » Posted by ぐ~たらパパ・おかだ at 06/08/03

ぐ~たらパパおかだです。

libm.a ですが、
gcc -o foo.out foo.o bar.o -lm
という具合いに、最後に -lm をすることでリンクがされます。
最後に入れるのがコツです。
逆に、math.h で定義した関数をあえて使いたくない場合は、
-lm オプションの後に hogehoge.o とかのファイルをおくと
良いです。
gcc(ld) は、指定されたファイル(.o) をその後ろで
指定しているファイル、ライブラリから探そうとするので、
このような流れになります。

CommentData » Posted by りおーじあ at 06/08/04

ぐ~たらパパ・おかださん、おはようございます。
コメントありがとうございます。
ご無沙汰しております。

>gcc(ld) は、指定されたファイル(.o) をその後ろで
指定しているファイル、ライブラリから探そうとするので、
このような流れになります。

やはり、そうなのですね。
なんとなくそうなのではないかと思っていました。

おかださんはgccとか詳しそうですね。
これからもよろしければ是非アドバイスお願いします。

それでは。

"math.hを使うには(未解決)"へコメントを投稿

(運営者が承認するまではコメントは表示されません。しばらくお待ちください。)

上の情報を保存する場合はチェック

スポンサードリンク