2014年03月27日

install_name_tool を使って Library not loaded を解消する

Mac で MySQLdb をインストールします。

import してみます

>>> import MySQLdb
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "MySQLdb/__init__.py", line 19, in <module>
    import _mysql
ImportError: dlopen(/some/where/lib/python2.7/site-packages/MySQL_python-1.2.5-p
y2.7-macosx-10.8-intel.egg/_mysql.so, 2): Library not loaded: libmysqlclient.18.
dylib
  Referenced from: /some/where/lib/python2.7/site-packages/MySQL_python-1.2.5-py
2.7-macosx-10.8-intel.egg/_mysql.so
  Reason: image not found
>>>

_mysql.so にリンクされている libmysqlclient.18.dylib が見当たらない、と言われていますね。

まずは確認しましょう。

$ otool -L /some/where/lib/python2.7/site-packages/MySQL_python-1.2.5-py2.7-maco
sx-10.8-intel.egg/_mysql.so
/some/where/lib/python2.7/site-packages/MySQL_python-1.2.5-py2.7-macosx-10.8-int
el.egg/_mysql.so:
	libmysqlclient.18.dylib (compatibility version 18.0.0, current version 1
8.0.0)
	/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version
 169.3.0)
$

リンク先の libmysqlclient.18.dylib のディレクトリ指定はありません。

このエラーについてググると、シンボリックリンクで解決、というページが沢山見つかります。 しかしその解決方法はなんだか Linux の .so の解決作法を OS X に持ってきただけみたいに見えます。

そこで今日のタイトルにある install_name_tool を使う解決方法を紹介しましょう。 今回使うのは -change というオプションです。 install_name_tool -change OLD NEW TARGET と指定します。 TARGET の OLD というリンク先を NEW に書き換えます。 具体的に書くとこうなります。

$ install_name_tool -change libmysqlclient.18.dylib /usr/local/mysql/lib/libmysq
lclient.18.dylib /some/where/lib/python2.7/site-packages/MySQL_python-1.2.5-py2.
7-macosx-10.8-intel.egg/_mysql.so
$

それでは確認しましょう。

$ otool -L /some/where/lib/python2.7/site-packages/MySQL_python-1.2.5-py2.7-maco
sx-10.8-intel.egg/_mysql.so
/some/where/lib/python2.7/site-packages/MySQL_python-1.2.5-py2.7-macosx-10.8-int
el.egg/_mysql.so:
	/usr/local/mysql/lib/libmysqlclient.18.dylib (compatibility version 18.0
.0, current version 18.0.0)
	/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version
 169.3.0)
$ python
>>> import MySQLdb
>>> 

リンク先が書き換わって、python からの import も成功していますね。

posted by mft at 01:08| Comment(0) | TrackBack(0) | 日記 | このブログの読者になる | 更新情報をチェックする