在boost python hello程序上导入错误

use*_*056 17 python boost

包括

using namespace boost::python;

struct World{
    void set(std::string msg) { this->msg = msg; }
    std::string greet() { return msg; }
    std::string msg;
};

BOOST_PYTHON_MODULE(hello)
{
    class_<World>("World")
        .def("greet", &World::greet)
        .def("set", &World::set)
    ;
}
Run Code Online (Sandbox Code Playgroud)

编译并构建好

~/boost$ g++ -fPIC -I/usr/include/python2.6 -c hello.cpp 
~/boost$ g++ -shared hello.o -o hello.so
Run Code Online (Sandbox Code Playgroud)

但是当从python端导入时,出错了.

>>> import hello.so
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: ./hello.so: undefined symbol: _ZNK5boost6python7objects21py_function_impl_base9max_arityEv
>>> 
Run Code Online (Sandbox Code Playgroud)

有谁能够帮我?提前致谢.

tr9*_*9sh 14

通过Boost Python通过"没有这样的文件或目录"错误解决了这个问题

g++ -c -fPIC hello.cpp -o hello.o
g++ -shared -Wl,-soname,hello.so -o hello.so  hello.o -lpython2.6 -lboost_python
Run Code Online (Sandbox Code Playgroud)

为我做了诀窍.我希望这一点尽可能清楚,因为我现在正在努力解决这个问题半小时;)


Yu *_*ang 6

与此处的其他帖子相同

g++ -c -fPIC hello.cpp -o hello.o
g++ -shared -Wl,-soname,hello.so -o hello.so  hello.o -lpython2.6 -lboost_python
Run Code Online (Sandbox Code Playgroud)

但我想强调“-lpython2.6 -lboost_python”位置的重要性。如果你把它们放在输入文件 (hello.o) 的前面,它们会以某种方式被忽略(不链接到最终的 hello.so)。至少对于 g++ (Ubuntu/Linaro 4.6.3-1ubuntu5) 来说是这样。

简单来说,http : //ubuntuforums.org/showthread.php?t=496287建议:

  g++ <.cpp or .o file(s)> [LDFLAGS] [LIBS] -o [appname]
Run Code Online (Sandbox Code Playgroud)

  • 据我了解,链接顺序敏感性的原因是 GNU `ld` 编译时链接器是一个单程链接器:它在命令行上从左到右选择要解析的符号,并且维护一个未解析符号的列表,所以如果 `hello.o` 在最后,它会引入新的未解析符号(在 `libpython2.6.so` 和 `libboost_python.so` 中定义),但它们现在不能得到解决,因为没有任何东西*在右边* 定义这些符号。 (4认同)

use*_*056 4

哦,我刚刚看到这个帖子:

boost python 需要帮助

并解决了问题

  • 那么,将“-lpython2.6 -lboost_python”添加到链接行的解决方案是什么呢?我并不完全清楚你从其他线程中学到了什么...... (7认同)