2009年1月24日土曜日

Mac OS ar の COMMAND_MODE

通常の端末からはビルドできるC++のシステムが,eclipseのCDTからだとビルドできないので調べてみた.いちどarで.aを作っておいて,さらにldでリンクするようになっているのだけど,ldのところでこんなエラーがでてこける.
ld: in XXXXX.a, archive has no table of contents
arのほうはこんなふうにかかれている.
ar aruv xxx.o xxx.o ..
arのバイナリは同じものが起動されていることはwhich等で確認できる.

とりあえずの解決

tableがarchiveに入っていないというエラーなので,強制的にtableを作るオプション's'を与えると,とりあえずビルドできるようになる.
ar asruv xxx.o xxx.o ..
しかし's'がデフォルトで, tableを作らないようにするためには'S'で明示しなければならないはず.環境変数でも見ているのかとおもって,マニュアルを見ても何も書かれていない.

もう少し調べてみる

バイナリをstringsで見てみる.最後に怪しいものが...
$ stings `which ar`
...
COMMAND_MODE
legacy
eclipseの中で確認してみるとたしかにこのCOMMAND_MODE環境変数がlegacyに設定されている.端末ではunix2003になっている.
$ echo $COMMAND_MODE
unix2003
$ COMMAND_MODE=legacy make
とやってlegacyを指定してビルドするとeclipse内と同じように失敗する.これが原因であることはほぼ確定.つまり,legacyが指定されているとarのデフォルトの挙動が変わるのだろう.問題はなんでこんなものが指定されているのか,だ.

ググってみたら一番上にこんなページを見つけた.推測でしかないのだが,eclipseはMac OS 10.4でも動くようにビルドされているので,launchd が起動時に識別して付けているのではないか,という話.うーん...

ちなみに,arのstringsでunix2003が引っかからないことからも予想できるように'legacy'以外なら何が指定されていてもちゃんとテーブルが生成される.

どう対処するのがただしいのか分からないのだけど s オプションは,他の環境でも付いていて害があるものではないので,かならずこれを付けるという方向で.

0 件のコメント: