首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >需要有关Boost.Python入门的帮助

需要有关Boost.Python入门的帮助
EN

Stack Overflow用户
提问于 2013-04-10 23:03:45
回答 5查看 4.3K关注 0票数 10

我正在尝试构建我的第一个Boost.Python示例。

代码语言:javascript
复制
#include <iostream>
#include <boost/python.hpp>

using namespace boost::python;


class Hello {

public:
    std::string greet() {
        std::cout << "Hello World" << std::endl;
    }
};


BOOST_PYTHON_MODULE(hello)
{
    class_<Hello>("Hello")
        .def("greet", &Hello::greet);
}

int main() {
    std::cout << "Boost.Python Test" << std::endl;
    Hello hello;
    hello.greet();
    return 0;
}

编辑:正如@cdhowie指出的那样,Python开发头文件丢失了。我已经找到并包含了所需的头文件。现在链接器正在抱怨:

代码语言:javascript
复制
   10:43:58 **** Build of configuration BoostPythonTest-DPar for project BoostPythonTest 

****
make all 
Building file: ../src/BoostPythonTest.cpp
Invoking: GCC C++ Compiler
/usr/local/bin/g++-4.7 -I/usr/local/Cellar/python3/3.3.0/Frameworks/Python.framework/Versions/3.3/include/python3.3m -I/usr/include -I/usr/local/Cellar/gcc/4.7.2/gcc/include/c++/4.7.2 -O0 -g3 -p -pg -Wall -c -fmessage-length=0 -std=c++11 -MMD -MP -MF"src/BoostPythonTest.d" -MT"src/BoostPythonTest.d" -o "src/BoostPythonTest.o" "../src/BoostPythonTest.cpp"
Finished building: ../src/BoostPythonTest.cpp

Building target: libBoostPythonTest-DPar.dylib
Invoking: MacOS X C++ Linker
/usr/local/bin/g++-4.7 -L/usr/local/Cellar/python3/3.3.0/Frameworks/Python.framework/Versions/3.3/lib/python3.3/config-3.3m -L/usr/local/Cellar/python3/3.3.0/Frameworks/Python.framework/Versions/3.3/lib -L/usr/local/Cellar/boost/1.51.0/lib -std=c++11 -Xlinker -ldl -framework CoreFoundation -lpython3.3m -dynamiclib -o "libBoostPythonTest-DPar.dylib"  ./src/BoostPythonTest.o   -lpython3.3m -lboost_python-mt -lpython3.3
Undefined symbols for architecture x86_64:
  "boost::python::detail::init_module(PyModuleDef&, void (*)())", referenced from:
      _PyInit_hello in BoostPythonTest.o
ld: symbol(s) not found for architecture x86_64
collect2: error: ld returned 1 exit status
make: *** [libBoostPythonTest-DPar.dylib] Error 1

我已经链接到-lpython3.3m -lboost_python-mt -lpython3.3了--还缺少什么?

编辑:我想我已经链接到了python3.3-config列出的所有内容。由于缺少符号,链接仍然不起作用。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2013-04-16 23:19:16

当这个特定的链接器错误发生时,它通常是应用程序针对Python的一个版本构建的结果,例如Python3.x头文件,而boost_python库是针对不同版本构建的,例如2.x。

boost/python/module_init.hpp中,针对Python3.x进行构建时,init_module函数具有以下签名:

代码语言:javascript
复制
PyObject* boost::python::detail::init_module(PyModuleDef&, void(*)());

在基于Python 2.x进行构建时,使用以下签名:

代码语言:javascript
复制
PyObject* boost::python::detail::init_module(char const* name, void(*)());

implementation 中可以看出,Boost.Python库中只有一个函数。因此,如果链接了Boost.Python库,而链接器只是抱怨无法解析3.x init_module函数,那么很可能Boost.Python库是针对Python2.x版本构建的,而应用程序代码是针对Python3.x头文件构建的。您可以通过转储Boost.Python库的符号并检查init_module签名来验证这一点。

要解决此问题,请使用构建Boost.Python时使用的相同版本的Python构建应用程序。在这种情况下,请执行以下任一操作:

  • 使用Python2.x头文件构建应用程序,并针对Python2.x libraries.
  • Build Boost.Python和Python3.x进行链接。This文档介绍了构建Boost的步骤,this文档详细介绍了Boost.Python。可能需要使用--with-python参数显式提供Python可执行文件,Boost.Python将根据该可执行文件在bootstrap过程中进行构建。
票数 13
EN

Stack Overflow用户

发布于 2013-04-10 23:06:00

您缺少Python开发头文件。您的Linux发行版应该为它们提供了一个包。(例如,Debian或Ubuntu上的python-dev。)

票数 6
EN

Stack Overflow用户

发布于 2013-04-11 03:45:12

您正在构建一个共享库,因为这就是二进制Python模块。为此,您需要-shared或-dynamic (请查看文档),并且不应该使用main()函数。

此外,如果这样还不能解决问题,并且仍然有链接器错误,那么可以使用"objdump -T --demangle /path/ to /lib“来找出库中包含哪些符号,以及库中是否包含您需要的符号。还要检查"ldd“的输出,它列出了依赖的共享对象。这将提示您要链接的一个或多个库。

在我的系统上,我还有一个叫做"python-config“和"python2.7-config”的程序。检查您是否有类似的东西,因为这个脚本知道要链接哪些库,至少对于python是这样。一个类似的工具是pkg-config,它更通用,也可以为boost提供信息。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15929566

复制
相关文章

相似问题

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