math.hを使うには(未解決)
Posted at 06/08/03 PermaLink» 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をリネームしてみるとエラーがでるので違うようです。
うーん、仕方がないので自前で必要な関数を用意することにしますか。まず確認でってやるとつまづいてばかりでちょっと悲しくなります。
カテゴリ
- 2足歩行ロボット (0)
- 2足歩行ロボット2 (0)
- 2足歩行ロボットキット(ミニスタジオ) (18)
- ABS手加工ロボット作成 (7)
- Alibre Design Xpress Plus (29)
- AlibreDesign ライブラリ (3)
- LPC2138関連 (30)
- Octave関連 (3)
- ROBO-ONE (7)
- ROBO-ONE on PC (55)
- イベント (2)
- ホームページ (1)
- マイロボット (5)
- モーション作成 (18)
- ロボット (34)
- 俺サーボ (66)
- 外装 (9)
- 日記・コラム・つぶやき (28)
- 書籍・雑誌 (10)
- 機体設計 (57)
- 画像処理 (3)
- 組み立て・配線 (14)
- 軽量化 (11)
- 電子回路・ファーム (40)
月別アーカイブ
- 2008年04月 (1)
- 2008年02月 (4)
- 2008年01月 (7)
- 2007年12月 (5)
- 2007年11月 (10)
- 2007年10月 (9)
- 2007年09月 (7)
- 2007年08月 (5)
- 2007年07月 (2)
- 2007年06月 (5)
- 2007年05月 (8)
- 2007年04月 (21)
- 2007年03月 (4)
- 2007年02月 (3)
- 2007年01月 (3)
- 2006年12月 (17)
- 2006年10月 (1)
- 2006年09月 (1)
- 2006年08月 (24)
- 2006年07月 (28)
- 2006年06月 (26)
- 2006年05月 (28)
- 2006年04月 (19)
- 2006年03月 (16)
- 2006年02月 (21)
- 2006年01月 (22)
- 2005年12月 (31)
- 2005年11月 (28)
- 2005年10月 (28)
- 2005年09月 (26)
- 2005年08月 (15)
- 2005年07月 (13)
- 2005年06月 (12)
- 2005年05月 (23)
- 2005年04月 (6)
フィード
Powered by Movable Type
Template by MTテンプレートDB
Supported by Movable Type入門
"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とか詳しそうですね。
これからもよろしければ是非アドバイスお願いします。
それでは。