Python 端加载 C++ 端动态库

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