ld: in XXXXX.a, archive has no table of contentsarのほうはこんなふうにかかれている.
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 legacyeclipseの中で確認してみるとたしかにこの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 件のコメント:
コメントを投稿