使用macOS在python中加载dylib库的问题

问题描述 投票:0回答:1

我知道已经问过很多类似的问题,但是我找不到适合我的情况的解决方案。我是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个回答
0
投票

libneurongpu正在通过@rpath调用子库libcurand,但无论在何处都找不到它。尝试使用otool -l /usr/local/lib/libneurongpu.0.dylib查看@rpath。然后,您可能希望调整库以从正确的位置调用子库。有两种选择。在库路径中删除@rpath。install_name_tool -change @rpath/libcurand.10.dylib libcurand.10.dylib /usr/local/lib/libneurongpu.0.dylib这将搜索与调用库相同的目录。

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

© www.soinside.com 2019 - 2024. All rights reserved.