Python 端加载 C++ 端动态库#
可以使用 ctypes
加载动态库:
import ctypes
# 作为全局加载,使全局外部符号对其他 dll 可见。
_LIB = ctypes.CDLL("../cpp/sym_add/outputs/libs/libtvm_ext.so", ctypes.RTLD_GLOBAL)
---------------------------------------------------------------------------
OSError Traceback (most recent call last)
Cell In[1], line 4
1 import ctypes
3 # 作为全局加载,使全局外部符号对其他 dll 可见。
----> 4 _LIB = ctypes.CDLL("../cpp/sym_add/outputs/libs/libtvm_ext.so", ctypes.RTLD_GLOBAL)
File /media/pc/data/lxw/envs/anaconda3a/envs/ai/lib/python3.12/ctypes/__init__.py:379, in CDLL.__init__(self, name, mode, handle, use_errno, use_last_error, winmode)
376 self._FuncPtr = _FuncPtr
378 if handle is None:
--> 379 self._handle = _dlopen(self._name, mode)
380 else:
381 self._handle = handle
OSError: ../cpp/sym_add/outputs/libs/libtvm_ext.so: undefined symbol: _ZNK3tvm7runtime6Object11DerivedFromEj
加载失败,是由于 libtvm_ext.so
是在 libtvm.so
基础上拓展的,故而需要先提前加载 libtvm.so
,或者直接 import tvm
:
import tvm
import ctypes
# 作为全局加载,使全局外部符号对其他 dll 可见。
_LIB = ctypes.CDLL("../cpp/sym_add/outputs/libs/libtvm_ext.so", ctypes.RTLD_GLOBAL)
加载动态库,也可以直接使用 load_lib()
:
from tvm_book.tvm_ext.libinfo import load_lib
_LIB_EXT, _LIB_EXT_NAME = load_lib(name="libtvm_ext.so", search_path=["../cpp/sym_add/outputs/libs"])
回调 C++ 函数:
import tvm
sym_add = tvm.get_global_func("tvm_ext.sym_add")
测试:
from tvm import te
x = te.var("x")
y = te.var("y")
z = sym_add(x, y)
assert z.a == x and z.b == y
print(z)
x + y