Проблема загрузки библиотек dylib в python с macOS - PullRequest
0 голосов
/ 25 февраля 2020

Я знаю, что подобные вопросы задавались много раз, но я не мог найти решение, которое сработало в моем случае. Я новичок ie с macOS, и наверняка мне чего-то не хватает, как работает динамическое связывание c в Ma c. Я должен импортировать библиотеку dylib в python, которая, в свою очередь, должна импортировать другую библиотеку. Вот соответствующие файлы, переменные среды и части кода:

$ 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

Я хотел бы понять не только то, что я должен сделать, чтобы импортировать библиотеки, но также и то, почему то, что я делаю, не работает.

Ответы [ 2 ]

1 голос
/ 25 февраля 2020

Правильный ответ - тот, который написал Ричард Барбер. Для тех, кто сталкивается с подобными проблемами и хочет понять, как динамические библиотеки ссылок c импортируются в macOS, простую и полезную статью можно найти здесь: https://blog.krzyzanowskim.com/2018/12/05/rpath-what/

1 голос
/ 25 февраля 2020

libneurongpu вызывает библиотеку libcurand через @rpath и не находит ее там, где ищет. Попробуйте otool -l /usr/local/lib/libneurongpu.0.dylib, чтобы увидеть @rpath. Затем вы можете wi sh настроить библиотеку для вызова вспомогательной библиотеки из правильного местоположения.

Есть два варианта.

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

...