Ngay cả khi bạn cung cấp đường dẫn đầy đủ cho CDLL hoặc cdll.LoadLibrary(), bạn vẫn có thể cần đặt LD_LIBRARY_PATH trước khi gọi Python. Nếu thư viện được chia sẻ bạn tải một cách rõ ràng đề cập đến một thư viện được chia sẻ khác và không có "đường dẫn" được đặt trong .so cho thư viện đó, thì thư viện đó sẽ không được tìm thấy, ngay cả khi thư viện đã được tải. Đường dẫn trong thư viện chỉ định đường dẫn tìm kiếm sẽ được sử dụng để tìm kiếm các thư viện khác mà thư viện đó cần có
Ví dụ: tôi có một nhóm thư viện bên thứ ba độc lập không do tôi sản xuất. b.so tham khảo a.so. Thậm chí nếu tôi tải a.so trước:
ctypes.cdll.LoadLibrary('/abs/path/to/a.so')
ctypes.cdll.LoadLibrary('/abs/path/to/b.so')
tôi nhận được một lỗi trên tải thứ hai, bởi vì b.so đề cập đến chỉ đơn giản là 'a.so', mà không có một rPath, vv b.so doesn' Tôi biết đó là a.so. Vì vậy, tôi phải đặt LD_LIBRARY_PATH trước để bao gồm '/ abs/path/to'.
Để tránh phải đặt LD_LIBRARY_PATH, bạn sửa đổi mục nhập đường đi trong tệp .so. Trên Linux, có hai tiện ích tôi thấy rằng thực hiện điều này: chrpath, và patchelf. chrpath có sẵn từ kho lưu trữ Ubuntu. Nó không thể thay đổi rpath trên .so của mà không bao giờ có một. patchelf là linh hoạt hơn.
Nguồn
2010-12-01 15:58:50
điều này chẩn đoán sự cố nhưng không giải quyết được. – dbliss