【问题标题】:Problem loading dylib libraries in python with macOS使用 macOS 在 python 中加载 dylib 库时出现问题
【发布时间】:2020-02-24 22:41:32
【问题描述】:

我知道类似的问题已经被问过很多次,但我找不到适合我的解决方案。我是 macOS 的新手,当然我错过了关于 Mac 中动态链接如何工作的一些内容。我必须在 python 中导入一个 dylib 库,而后者又应该导入另一个库。 以下是相关文件、环境变量和部分代码:

$ echo $DYLD_LIBRARY_PATH 
/usr/local/lib/:/Developer/NVIDIA/CUDA-10.2/lib

$ ls /Developer/NVIDIA/CUDA-10.2/lib/libcurand.*
/Developer/NVIDIA/CUDA-10.2/lib/libcurand.10.dylib
/Developer/NVIDIA/CUDA-10.2/lib/libcurand.dylib

$ ls -al /usr/local/lib/libcurand.*
lrwxr-xr-x  1 golosio  admin  50 Feb 24 09:55 /usr/local/lib/libcurand.10.dylib -> /Developer/NVIDIA/CUDA-10.2/lib/libcurand.10.dylib
lrwxr-xr-x  1 golosio  admin  47 Feb 24 09:55 /usr/local/lib/libcurand.dylib -> /Developer/NVIDIA/CUDA-10.2/lib/libcurand.dylib

$ ls -al /usr/local/lib/libneurongpu.*
-rwxr-xr-x  1 root  admin  4496 Feb 24 10:32 /usr/local/lib/libneurongpu.0.dylib
lrwxr-xr-x  1 root  admin    20 Feb 24 10:32 /usr/local/lib/libneurongpu.dylib -> libneurongpu.0.dylib
-rwxr-xr-x  1 root  admin   953 Feb 24 10:32 /usr/local/lib/libneurongpu.la

$ python

>>> import ctypes

>>> lib_path="/usr/local/lib/libneurongpu.dylib"

>>> _neurongpu=ctypes.CDLL(lib_path)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/ctypes/__init__.py", line 366, in __init__
    self._handle = _dlopen(self._name, mode)
OSError: dlopen(/usr/local/lib/libneurongpu.dylib, 6): Library not loaded: @rpath/libcurand.10.dylib
  Referenced from: /usr/local/lib/libneurongpu.dylib
  Reason: image not found

我不仅想了解导入库应该怎么做,还想了解为什么我正在做的事情不起作用。

【问题讨论】:

    标签: python macos dynamic-linking dylib


    【解决方案1】:

    libneurongpu 正在通过 @rpath 调用子库 libcurand,但在任何地方都找不到它。尝试otool -l /usr/local/lib/libneurongpu.0.dylib 以查看@rpath。 然后您可能希望调整库以从正确的位置调用子库。

    有两种选择。

    1。 删除库路径中的 @rpath。 install_name_tool -change @rpath/libcurand.10.dylib libcurand.10.dylib /usr/local/lib/libneurongpu.0.dylib 这将搜索与调用库相同的目录。

    2。 将@rpath(或添加另一个)设置到正确的目录。 install_name_tool -add_rpath /usr/local/bin /usr/local/lib/libneurongpu.0.dylib

    【讨论】:

    【解决方案2】:

    正确答案是 Richard Barber 发布的答案。有类似问题想了解macOS中如何导入动态链接库的朋友,可以在这里找到一篇简单好文章:https://blog.krzyzanowskim.com/2018/12/05/rpath-what/

    【讨论】:

    • 我很高兴它成功了。在大多数情况下,install_names 由自动机处理,尤其是当它们很多时。
    猜你喜欢
    • 2020-06-25
    • 1970-01-01
    • 2015-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-04
    • 2018-04-14
    • 2013-06-18
    相关资源
    最近更新 更多