我有一个带有头文件和 .so 库的外部库。我想通过 PyBind11 包装它以从 Python 访问 C 代码。我可以很好地构建模块,但是当我想导入它时,我得到:
/home/user/dev/external/Python/PyBind_Module/external_python.cpython-310-x86_64-linux-gnu.so: undefined symbol: <FUNCTION>
File "/home/user/dev/external/Python/pybind_test.py", line 3, in <module>
import external_wrapper as exw
ImportError: /home/user/dev/external/Python/PyBind_Module/external_python.cpython-310-x86_64-linux-gnu.so: undefined symbol: <FUNCTION>
当我做
nm -gD libexternal.so
时,我在暴露的列表中找到
nm -gD /usr/lib/libexternal.so | grep 'FUNCTION'
00000000000170c0 T FUNCTION
0000000000018ff0 T FUNCTIONd
我将该文件放在 /usr/lib 中,我认为这意味着代码应该在加载 .so 文件时找到它,但我现在假设我需要告诉 PyBind 或我的 python 代码来查找该库。我该如何解决这个问题?
编辑:
设置.py:
from pathlib import Path
from pybind11.setup_helpers import build_ext
from pybind11.setup_helpers import Pybind11Extension
from setuptools import setup
example_module = Pybind11Extension(
"external_python",
sources=[str(fname) for fname in Path("src").glob("*.cpp")],
include_dirs=["include", "."],
extra_compile_args=["-O3"],
libraries=["/usr/lib/libexternal.so"],
library_dirs=["/usr/lib"]
)
setup(
name="external_module",
version=1.0,
description="C++ wrapper around the external library",
ext_modules=[example_module],
cmdclass={"build_ext": build_ext},
)
我能想到两个问题
#ifdef __cpluplus ... extern "C"
就像 -->#ifdef __cplusplus
extern "C"{
#endif
... declaration of your C functions
#ifdef __cplusplus
}
#endif
setup.py
文件并不包含所有内容,我在 this repo 中编译了一些基本示例,并使用各种方法来编译包装器,这可能会有所帮助。祝你好运:)