簡體   English   中英

嘗試在 python session 中導入用 c++ 編寫的共享庫時出現“未定義符號”錯誤

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

我正在按照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 function 以便我可以使用from modd import oneforth

我正在構建共享庫*.so使用 -

g++ -c -fPIC py.cpp -o py.o
g++ -shared py.so  py.o

每當我嘗試導入動態py.so時,都會出現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 中找到。 這意味着您必須將您的庫與-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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM