在 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
我从 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