Mac OS X Snow Leopard (10.6) でlibiconvを必要とするプログラムをビルドするときの注意

簡潔なまとめ

Mac OS X Snow Leopard*1付属のlibiconvは一般的なlibiconvとシンボル定義(関数名)が異なるため、MacportsやらHomebrewやら自前やらでlibiconvとiconv.hを入手してそれを使うべき。

長いまとめ(あるいは愚痴)

これでハマって貴重な日曜日の自由時間が3時間ほど失われた。その無念を込めて記す。

日本語ファイル名を含むZIPファイルを扱うシェルスクリプトを書こうとして、unzipコマンドにファイル名のエンコーディングをよしなに扱ってくれるパッチを当てようとしていたときのこと。unzipのソースをとってきて、パッチを当てて、普通にmakeして終わりかと思いきや、下記のようなエラーに遭遇。

Undefined symbols:
  "_iconv_close", referenced from:
      _charset_to_intern in unix.o
  "_iconv_open", referenced from:
      _charset_to_intern in unix.o
  "_iconv", referenced from:
      _charset_to_intern in unix.o
ld: symbol(s) not found

あー、libiconvが見えてないのね、と理解して、-liconvが付与されるようにMakefileを修正*2して再makeしても状況変わらず。なんでだー!? としばらく悩むこと小1時間。

Leopard に PHP5.2.6 をインストールするによれば、configureスクリプトの--with-iconvを--with-iconv=shared,/usrに変更すればよいとのことだが、今回の都合には合わず断念。_iconv_closeなどをlibiconv_closeなどに修正すれば直ったとの記載もあるので、要はMax OS X付属のiconv.hがなんかおかしいんだろ、と思い、homebrewでlibiconvをインストール*3して、-I/usr/local/includeと-L/usr/local/libが付与されるようMakefileを修正したらうまくビルドできた。

これで無事Windowsで作った日本語ファイル名のファイル入りZIPファイルとかがMax OS Xで文字化けせずに展開できるようになったわけだが、本来作りたかったスクリプトを作る時間はもうないのだった。だるい。

*1:Snow Leopard限定かどうかは知らない。ほかのバージョンでもだめかもしれない

*2:unzipMakefileは各環境名のサブディレクトリに含まれるMakefileをコピーして使うことになっているが、依然としてコピー元のファイルも読まれるらしく、修正を入れる場合はコピー元と先両方に必要

*3:仕様なのか何なのか知らないがコマンドと違って/usr/local/libや/usr/local/includeにリンクが張られなかった。ので手動で張った