naoya_t@hatenablog

いわゆるチラシノウラであります

x86_64なアーカイブにリンクできない?と思ったらbinutilsのarとranlibが悪さをしていたらしい話

Lionにて。

WordNet®をビルドしようとしていて、リンカさんに

$ ./configure
$ make
...
ld: warning: ignoring file ../lib/libWN.a, file was built for archive which is not the architecture being linked (x86_64)

て云われた。WordNet3.0でも2.1でも同様。

$ file lib/libWN.a
lib/libWN.a: current ar archive

$ lipo -info ../lib/libWN.a
input file lib/libWN.a is not a fat file
Non-fat file: lib/libWN.a is architecture: x86_64

問題なさそうに見えるのに…

$ ./configure CFLAGS="-O3 -arch i386"
$ make

だとビルドできて一応動くのだけれど、それではちょっと悔しいというか残念というか。

ぐぐってみるとXCodeiPhoneのarmv6/v7あたりの話(本当にビルドターゲットが異なるケース)がよく出てくるけどちょっと違う。

不意にarを調べてみた。

$ which ar
/usr/local/bin/ar

$ which ranlib
/usr/local/bin/ranlib

おや?

$ ls -l /usr/local/bin/ar
-rwxr-xr-x  2 root  admin  655968  1 23 15:30 /usr/local/bin/ar

$ ls -l /usr/local/bin/ranlib
-rwxr-xr-x  2 root  admin  655968  1 23 15:30 /usr/local/bin/ranlib

$ ls -l /usr/local/bin/objdump 
-rwxr-xr-x  2 root  admin  1738904  1 23 15:30 /usr/local/bin/objdump

タイムスタンプが objdump と一緒だ… こないだ brew install binutils した時に入ったと見て間違いないだろう…

/usr/bin のやつを指名してやってみる。

$ ./configure AR="/usr/bin/ar" RANLIB="/usr/bin/ranlib" CFLAGS="-O3 -arch x86_64"
$ make clean ; make

今度は行けた。犯人はbinutilsのar/ranlibだった。

ちなみに今回のは file コマンドで見ると

$ file lib/libWN.a
lib/libWN.a: current ar archive random library

binutils版と違った表示になることを発見。