使用 macOS 在 python 中加载 dylib 库时出现问题
Problem loading dylib libraries in python with macOS
我知道类似的问题已被问过很多次,但我找不到适合我的情况的解决方案。我是 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
我不仅想了解应该如何导入库,还想了解为什么我所做的不起作用。
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
正确答案是理查德·巴伯 (Richard Barber) 发布的答案。对于任何遇到类似问题并想了解如何在 macOS 中导入动态 link 库的人,可以在此处找到一篇简单而好的文章:https://blog.krzyzanowskim.com/2018/12/05/rpath-what/
我知道类似的问题已被问过很多次,但我找不到适合我的情况的解决方案。我是 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
我不仅想了解应该如何导入库,还想了解为什么我所做的不起作用。
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
正确答案是理查德·巴伯 (Richard Barber) 发布的答案。对于任何遇到类似问题并想了解如何在 macOS 中导入动态 link 库的人,可以在此处找到一篇简单而好的文章:https://blog.krzyzanowskim.com/2018/12/05/rpath-what/