Nawet jeśli dają pełną ścieżkę do CDLL lub cdll.LoadLibrary(), może trzeba jeszcze ustawić LD_LIBRARY_PATH przed wywołaniem Python. Jeśli udostępniona biblioteka jest ładowana jawnie, odwołuje się do innej biblioteki współużytkowanej i nie ustawiono "rpath" w .so dla tej biblioteki, to nie zostanie znaleziona, nawet jeśli została już załadowana. Ścieżka rpath w bibliotece określa ścieżkę wyszukiwania, która ma być używana do wyszukiwania innych bibliotek potrzebnych dla tej biblioteki. Na przykład, mam przypadek zestawu niezależnych bibliotek innych producentów, które nie zostały wyprodukowane przeze mnie. b.so odnosi się do a.so. Nawet jeśli załadować a.so z góry:
ctypes.cdll.LoadLibrary('/abs/path/to/a.so')
ctypes.cdll.LoadLibrary('/abs/path/to/b.so')
pojawia się błąd na drugim obciążeniu, ponieważ b.so oznacza po prostu „a.so”, bez rPath, a więc b.so robi” t wiem, że to jest poprawne a.so. Dlatego muszę wcześniej ustawić LD_LIBRARY_PATH, aby uwzględnić "/ abs/path/to".
Aby uniknąć konieczności ustawiania LD_LIBRARY_PATH, należy zmodyfikować wpis rpath w plikach .so. W Linuksie są dwa narzędzia, które mogę to zrobić: chrpath i patchelf. chrpath jest dostępna z repozytoriów Ubuntu. Nie można zmienić ścieżki na .so, która nigdy nie miała. patchelf jest bardziej elastyczny.
to diagnozuje problem, ale go nie rozwiązuje. – dbliss