1

ctypes/sw/lib/ライブラリへのフル パスを明示的に指定しない限り、fink を介してインストールされたライブラリが見つかりません。

>>> import ctypes
>>> ctypes.CDLL('libgoffice-0.8.dylib')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/sw/lib/python2.7/ctypes/__init__.py", line 353, in __init__
    self._handle = _dlopen(self._name, mode)
OSError: dlopen(libgoffice-0.8.dylib, 6): image not found
>>> ctypes.CDLL('/sw/lib/libgoffice-0.8.dylib')
<CDLL '/sw/lib/libgoffice-0.8.dylib', handle 336500 at 2b10b0>
>>>

gccただし、を使用したこれらのライブラリに対するコンパイルは正常に機能します。それらは常に見つかります。がこれらのライブラリを見つけられないのはなぜctypesですか? それらを見つけるにはどうすればよいですか?

これは、OS X 10.6.8 に fink で Python 2.7 をインストールしたものです/sw/bin/python2.7

4

1 に答える 1

2

問題は、fink がLD_LIBRARY_PATH変数を設定しないことにあるようです。デフォルトでは検索しないものをctypes使用します。マニュアルページから:dlopen()/sw/libdlopen

dlopen() は、一連の環境変数とプロセスの現在の作業ディレクトリによって指定されたディレクトリで、互換性のある Mach-O ファイルを検索します。設定する場合、環境変数には、現在の作業ディレクトリに対して絶対パスまたは相対パスのコロンで区切られたリストが含まれている必要があります。環境変数は、LD_LIBRARY_PATH、DYLD_LIBRARY_PATH、および DYLD_FALLBACK_LIBRARY_PATH です。最初の 2 つの変数にはデフォルト値がありません。DYLD_FALL-BACK_LIBRARY_PATH のデフォルト値は $HOME/lib;/usr/local/lib;/usr/lib です。dlopen() は、環境変数で指定されたディレクトリーを、リストされている順序で検索します。

したがって、解決策は.profile、、、.bash_profileまたは.bashrc

export LD_LIBRARY_PATH=/sw/lib:"${LD_LIBRARY_PATH}"

また、fink は/sw/lib、 などの の下のサブディレクトリにいくつかのライブラリをインストールするよう/sw/lib/mysqlです。これらの場合、 はdlopen()のパスを再帰的に検索しないように見えるため、それらも明示的に含める必要がありますLD_LIBRARY_PATH。MySQL の場合、それをパスに追加する必要があります。

export LD_LIBRARY_PATH=/sw/lib:/sw/lib/mysql:"${LD_LIBRARY_PATH}"
于 2012-03-19T18:47:01.977 に答える