在 python 会话中尝试导入用 C++ 编写的共享库时出现“未定义符号”错误

getting `undefined symbol` errors when trying to import shared library written in c++ in python session

我从 boost.python 关注 this tutorial 以创建共享库。这是一个简单的代码,定义了我想公开给 python.

的方法
#include <boost/python.hpp>
#include <iostream>

const int oneforth(int num, int bound) {
    if (num < bound) {return num;}
    return oneforth(num * (1/4), bound);
}


BOOST_PYTHON_MODULE(modd) //python module name
{
    using namespace boost::python;
    def("oneforth", oneforth); //python method
}


int main() {
    std::cout << oneforth(10, 4);
    return 0;
}
ai

我想公开 oneforth 函数以便我可以使用 from modd import oneforth

我正在使用 -

构建共享库 *.so
g++ -c -fPIC py.cpp -o py.o
g++ -shared py.so  py.o

每当我尝试导入动态 py.so 时,我都会收到类似 undefined symbol 的错误。我究竟做错了什么?如何以这种方式创建共享库?

我试图重现这个并收到两条不同的错误消息 'like undefined symbol'。我会解释两者,因为我不能 100% 确定您遇到的是哪一个。

第一个是:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: /mnt/tmpfs/py.so: undefined symbol: _ZNK5boost6python7objects21py_function_impl_base9max_arityEv

此处的未定义符号是一个错位的 C++ 名称 boost::python::objects::py_function_impl_base::max_arity() const,例如可以在 libboost_python39.so 中找到。这意味着您必须 link 您的库 -lboost_python39 才能使该符号可用。

第二个是:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: dynamic module does not define module export function (PyInit_py)

当我为库文件提供源代码中提到的模块名称时,这个问题就消失了 modd.so。我以前从未使用过 boost_python,所以我不能保证这实际上就是错误的意思。

TL;TR

我通过将第二个构建行更改为

来让它工作
g++ -shared -o modd.so py.o -lboost_python39