2013-04-10 95 views
9

我正在尝试构建我的第一个Boost.Python示例。需要帮助Boost.Python入门

#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开发标题丢失。我找到并包含了所需的头文件。现在,链接器在抱怨:

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列出的所有内容。由于缺少符号,链接仍然不起作用。

回答

12

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

PyObject* boost::python::detail::init_module(PyModuleDef&, void(*)()); 

和下面的签名反对的Python 2.x的建设时:

boost/python/module_init.hpp中,init_module功能建设时对Python 3.x都有以下签名

PyObject* boost::python::detail::init_module(char const* name, void(*)()); 

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

要解决此问题,请使用构建Boost.Python的相同版本的Python构建应用程序。在这种情况下,要么:

  • 使用Python 2.x头文件构建应用程序,并链接到Python 2.x库。
  • 针对Python 3.x构建Boost.Python。This文档描述了构建Boost的步骤,this文档详细介绍了Boost.Python。通过使用--with-python参数,在bootstrap进程中可能需要显式提供Boost.Python将用于构建的Python可执行文件。
+0

我相信你正确地诊断了这个问题。我现在试图在Python 3.3上构建Boost.Python。 – clstaudt 2013-04-22 09:06:38

+0

当我尝试构建Boost.Python时,出现[以下错误](https://gist.github.com/anonymous/5433641)。 'gcc.link.dll ../../../../bin.v2/libs/python/build/gcc-4.2.1/debug/libboost_python.dylib ld:warning:目录找不到选项' -L/usr/local/Cellar/python3/3.3.0/Frameworks/Python.framework/Versions/3.3/lib/python3.3/config' ld:未知选项:-R collect2:ld返回1退出状态 这里发生了什么? – clstaudt 2013-04-22 09:53:35

+1

@cls:如果您使用的是Apple的GCC工具链版本,请尝试将工具集指定为'darwin'而不是'gcc'。 – 2013-04-22 13:35:53

6

您错过了Python开发头文件。你的Linux发行版应该有一个包。 (例如,在Debian或Ubuntu上为python-dev)。

+1

感谢您指出错误。但我在OSX上,任何想法如何获得标题?家酿似乎没有一个公式'python-dev'。 – clstaudt 2013-04-10 15:10:49

+1

@cls我不使用OS X,所以我不能在那里提供任何建议。也许别人可以。 – cdhowie 2013-04-10 15:19:59

+0

发现头文件,但有链接器的问题,我希望得到的例子工作。 – clstaudt 2013-04-10 17:05:54

2

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

此外,如果这没有帮助,并且仍然存在链接器错误,请使用“objdump -T --demangle/path/to/lib”来找出库中包含哪些符号,以及它是否具有您需要。还要检查“ldd”的输出,它列出了相关的共享对象。这应该给你一个提示链接库或库的提示。

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

+0

'python3.3-config'给了我添加了一些路径和标志,但没有任何效果(请参阅上面的调用)。 'otool'(显然是'objdump'的OSX等价物)给了我例如'$ otool -T libboost_python-mt.dylib libboost_python-mt.dylib: 目录(0个条目) 模块索引符号索引'。 'ldd'似乎不存在于OSX上。 – clstaudt 2013-04-16 08:57:22

2

不知道这是否是这样做的,但似乎PY_VERSION_HEX设置错误。 会发生什么,如果你

#define PY_VERSION_HEX 0x03300000 

包括在BoostPythonTest.cpp Boost.Python的头前?

+0

这是一条评论,而不是答案。 – 2017-01-23 20:45:47