首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在python会话中尝试导入用c++编写的共享库时获得“未定义的符号”错误

在python会话中尝试导入用c++编写的共享库时获得“未定义的符号”错误
EN

Stack Overflow用户
提问于 2021-02-05 17:41:08
回答 1查看 1.4K关注 0票数 1

我跟随本教程boost.python创建一个共享库。下面是一个简单的代码,它定义了我想要向python公开的方法。

代码语言:javascript
复制
#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使用-

代码语言:javascript
复制
g++ -c -fPIC py.cpp -o py.o
g++ -shared py.so  py.o

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-02-05 22:23:32

我试图复制这个错误信息,并得到了两条不同的错误信息,“就像未定义的符号”。我会解释这两个,因为我不能百分之百地确定你遇到了哪一个。

第一项是:

代码语言:javascript
复制
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链接起来,才能使这个符号可用。

第二个问题是:

代码语言:javascript
复制
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

我将第二个构建行更改为

代码语言:javascript
复制
g++ -shared -o modd.so py.o -lboost_python39
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66068038

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档