簡體   English   中英

ctypes加載具有依賴關系的ac共享庫

[英]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命令的末尾。 對我來說,它解決了這個問題。

我有同樣的問題。 為了解決這個問題,需要做兩件事:

  1. 像其他用戶所說的那樣使用RTLD_GLOBAL
  2. 您需要加載庫使用的每個庫。 因此,如果在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM