[英]Segmentation fault (core dumped) during loading shared library in Python ctypes
[英]ctypes loading a c shared library that has dependencies
在Linux上,我有一個依賴於其他庫的交流共享庫。 正確設置LD_LIBRARY_PATH以允許鏈接器加載所有庫。 當我做:
libgidcwf = ctypes.cdll.LoadLibrary(libidcwf_path)
我收到以下錯誤:
Traceback (most recent call last):
File "libwfm_test.py", line 12, in <module>
libgidcwf = ctypes.cdll.LoadLibrary(libidcwf_path)
File "/usr/lib/python2.5/ctypes/__init__.py", line 431, in LoadLibrary
return self._dlltype(name)
File "/usr/lib/python2.5/ctypes/__init__.py", line 348, in __init__
self._handle = _dlopen(self._name, mode)
OSError: path-to-my-lib/libwav.so: undefined symbol: ODBCGeneralQuery
看來LD_LIBRARY_PATH在這里沒有效果。 有沒有辦法讓這些依賴庫“可加載”?
先謝謝您的幫助。
似乎libwav.so沒有聲明它依賴於定義ODBCGeneralQuery的庫。 嘗試運行ldd path-to-my-lib/libwav.so
並查看是否缺少某些內容。 如果這是您正在構建的共享庫,則應將-llibname
添加到鏈接命令(類似於gcc -shared -o libwav.so ao bo co
那個)中,以用於庫代碼使用的每個庫。 以這種方式由原始共享庫引用的任何其他庫也應自動加載。
您應該使用RTLD_GLOBAL 。 我有一個混合平台系統,所以我的代碼看起來像這樣:
import numpy, ctypes
try:
if "Linux" in esmfos:
_ESMF = ctypes.CDLL(libsdir+'/libesmf.so',mode=ctypes.RTLD_GLOBAL)
else:
_ESMF = numpy.ctypeslib.load_library('libesmf',libsdir)
except:
traceback.print_exc(file=sys.stdout)
sys.exit(ESMP_ERROR_SHAREDLIB)
編譯共享對象時,請確保將所有-lsomething
放在string命令的末尾。 對我來說,它解決了這個問題。
我有同樣的問題。 為了解決這個問題,需要做兩件事:
RTLD_GLOBAL
ODBCGeneralQuery
中定義了libIDCodbc
,則首先需要運行以下行: ctypes.CDLL("libIDCodbc.so", mode = ctypes.RTLD_GLOBAL)
我發現我必須使用RTLD_LAZY
因為未鏈接的未定義符號,因為它沒有被使用。 由於我的ctypes中沒有ctypes.RTLD_LAZY
,我不得不使用:
ctypes.CDLL(libidcwf_path, mode=1)
我通過檢查/usr/include/bits/dlfcn.h
找到了這種模式,這可能不是標准的。 帽子提示ctypes郵件列表上的這個2006 線程 。
根據Walter Nissen的上述答案 ,您可以將代碼修改為:
import os
ctypes.CDLL(libidcwf_path, mode=os.RTLD_LAZY)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.