加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 需要帮助开始使用Boost.Python

发布时间:2020-12-16 03:06:28 所属栏目:百科 来源:网络整理
导读:我正在尝试构建我的第一个Boost. Python示例. #include iostream#include boost/python.hppusing namespace boost::python;class Hello {public: std::string greet() { std::cout "Hello World" std::endl; }};BOOST_PYTHON_MODULE(hello){ class_Hello("He
我正在尝试构建我的第一个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列出的所有内容.链接仍然不起作用,因为缺少符号.

解决方法

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

boost/python/module_init.hpp中,在构建Python 3.x时,init_module函数具有以下签名:

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

以及在构建Python 2.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构建Boost.Python 3.x. This文档介绍了构建Boost的步骤,并提供了关于Boost.Python的this文档.在引导过程中,通过使用–with-python参数,可能需要显式提供Boost.Python将构建的Python可执行文件.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读