我跟随本教程从boost.python创建一个共享库。下面是一个简单的代码,它定义了我想要向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的错误。我做错了什么?如何以这种方式创建共享库?
发布于 2021-02-05 22:23:32
我试图复制这个错误信息,并得到了两条不同的错误信息,“就像未定义的符号”。我会解释这两个,因为我不能百分之百地确定你遇到了哪一个。
第一项是:
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中找到。这意味着您必须将库与-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_python39https://stackoverflow.com/questions/66068038
复制相似问题