由于缺少符号,Python 导入失败

问题描述 投票:0回答:1

我有一个带有头文件和 .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},
)
python shared-libraries pybind11
1个回答
0
投票

我能想到两个问题

  1. 这可能是因为您使用了 C 代码。我不太清楚其中的区别,但由于多态性,C++ 在 ABI 级别上为已编译函数命名的方式与 C 不同。由于很棒的 Pybind 使用 C++ 结构,您可能必须使用
    #ifdef __cpluplus ... extern "C"
    就像 -->
#ifdef __cplusplus
extern "C"{
#endif

... declaration of your C functions

#ifdef __cplusplus
}
#endif
  1. 也许你的
    setup.py
    文件并不包含所有内容,我在 this repo 中编译了一些基本示例,并使用各种方法来编译包装器,这可能会有所帮助。

祝你好运:)

© www.soinside.com 2019 - 2024. All rights reserved.