ar と ranlib で GW の1日潰した話

とある翻訳デコーダを gcc だけでなく clang でもコンパイルできるようにしようと思い、KenLM の人に連絡したところ、ビルドツールをサクッと変更してくれて、ついでにヤバい警告が起きているコードも修正することができ、「Linux の clang でコンパイルが通るように変更できたよ」とのメールが来たのでめでたしめでたしと思っていました。

が、Mac OS X (10.7) 環境では静的ライブラリとオブジェクトファイルのリンクに失敗してしまうという問題が起きました。なぜだ。なぜだ。とりあえず昼寝したり、テレビでマンチェスターシティの試合見たりしても一向に原因が分からない。

てっきり、ビルドツールの設定ファイルに間違いがあるんじゃないか、OS X 用の clang の jamfile がおかしいんじゃないか、などと思いつつエラーを見てたので、山のようにあるエラーメッセージの中に以下のような警告があるのを見落としてました。

ld: warning: ignoring file libLM.a, file was built for archive which is not the architecture being linked (x86_64)

gcc の場合でもアーキテクチャの指定はビルドツール側で設定してあるしそんなはずはないと思ってました。とりあえず上記のエラーメッセージで Web 検索したところ、[1] のページが見つかりました。「もしや自分も?」と思い ar と ranlib のパスを調べてみると

$ which ar 
/Users/tetsuok/local/bin/ar 
$ which ranlib 
/Users/tetsuok/local/bin/ranlib

なんと $HOME/local/bin に ar と ranlib を野良インストールしてました。原因はこれだと思い、/usr/bin/ar と /usr/bin/ranlib を使うようにしてもう一度ビルドしたら通りました。ビルドツールに問題があったのではなく、使っている自分のマシンの方に問題があったという、笑えないオチでした。

最近は専ら野良インストールなんてせずに Homebrew とかに任せていたので、これらのツールをインストールしていたことをすっかり忘れていた上に、まさかこれらが悪さをしているとは思ってもいませんでした。(二台の Mac でテストしてたので、自分のマシンのせいではないのかもと思ってたら大間違いでした。両方とも $HOME/local/bin に ar と ranlib をインストールしてました。) 

id:naoyat さんには感謝です。

 

[1] http://naoyat.hatenablog.jp/entry/2012/01/31/033312