【问题标题】:ctypes doesn't find fink-installed libraries in /sw/libctypes 在 /sw/lib 中找不到 fink 安装的库
【发布时间】:2012-03-19 18:04:06
【问题描述】:

ctypes 找不到通过 fink 安装的库,这些库位于 /sw/lib/ 下,除非我明确给出库的完整路径

>>> 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 上,在/sw/bin/python2.7 下安装了 fink 的 Python 2.7。

【问题讨论】:

    标签: python ctypes fink


    【解决方案1】:

    问题似乎是 fink 从不设置 LD_LIBRARY_PATH 变量。 ctypes 使用 dlopen(),默认情况下不会在 /sw/lib 中搜索。来自dlopen 手册页:

    dlopen() 在指定目录中搜​​索兼容的 Mach-O 文件 由一组环境变量和进程的当前工作 目录。设置时,环境变量必须包含冒号分隔符 arated 目录路径列表,可以是绝对的或相对于 当前工作目录。环境变量是 LD_LIBRARY_PATH, DYLD_LIBRARY_PATH 和 DYLD_FALLBACK_LIBRARY_PATH。前两个变量 能力没有默认值。 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}"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多