我应该包括啥来制作 boost.python 扩展?

Posted

技术标签:

【中文标题】我应该包括啥来制作 boost.python 扩展?【英文标题】:What am I supposed to include to make a boost.python extension?我应该包括什么来制作 boost.python 扩展? 【发布时间】:2020-10-19 00:13:02 【问题描述】:

编辑:不小心复制粘贴了两次。

我正在使用 boost 和普通 C API 的组合制作 C++ Python 扩展,但我无法编译它。我已阅读以下文档:

documentation from boost.org

documentation from python wiki

Python bindings for C++ medium

这是来自 cpp 文件的代码:

#include 
#include 
#include 

#include 
#include 
使用命名空间标准;
类测试类
    测试类(字符串味精)
        cout ("TestClass", init<:string>());

生成文件:

test: test.cpp
    g++ -Wall -shared -std=c++11 -fPIC -I/usr/include -o test`python3-config --extension-suffix` test.cpp

错误输出:

test.cpp:17:5: error: ‘class_’ was not declared in this scope
     class_<TestClass>("TestClass", init<std::string>());
     ^
test.cpp:17:5: note: suggested alternative:
In file included from /usr/include/boost/python/object_core.hpp:20:0,
                 from /usr/include/boost/python/args.hpp:25,
                 from /usr/include/boost/python.hpp:11,
                 from test.cpp:1:
/usr/include/boost/python/def_visitor.hpp:14:56: note:   ‘boost::python::class_’
 template <class T, class X1, class X2, class X3> class class_;
                                                        ^
test.cpp:17:21: error: expected primary-expression before ‘>’ token
     class_<TestClass>("TestClass", init<std::string>());
                     ^
test.cpp:17:36: error: ‘init’ was not declared in this scope
     class_<TestClass>("TestClass", init<std::string>());
                                    ^
test.cpp:17:36: note: suggested alternative:
In file included from /usr/include/boost/python/class.hpp:20:0,
                 from /usr/include/boost/python.hpp:18,
                 from test.cpp:1:
/usr/include/boost/python/init.hpp:58:7: note:   ‘boost::python::init’
 class init; // forward declaration
       ^
test.cpp:17:52: error: expected primary-expression before ‘>’ token
     class_<TestClass>("TestClass", init<std::string>());
                                                    ^
test.cpp:17:54: error: expected primary-expression before ‘)’ token
     class_<TestClass>("TestClass", init<std::string>());
                                                      ^
make: *** [test] Error 1

我想我已经包含了所有的头文件,但我不确定为什么它说它没有在这个范围内声明。任何帮助将不胜感激

【问题讨论】:

【参考方案1】:

就像(几乎?)Boost 中的所有内容(不是宏)一样,class_ 位于命名空间中,在本例中为 boost::python。要么:

    在文件顶部添加using namespace boost::python;(就在包含之后)。 请参阅boost::python::class_

这同样适用于其他符号。

这是shown in the quickstart part of the documentation。对于其余的大部分内容,它们只显示短代码 sn-ps,所以我认为它是隐含的。

【讨论】:

以上是关于我应该包括啥来制作 boost.python 扩展?的主要内容,如果未能解决你的问题,请参考以下文章

GUITexture 已弃用,那么我应该使用啥来代替它?

用啥来替换python中的接口/协议

C++使用boost.python编写Python扩展

如何在 boost::python 扩展模块中正确组合 C++ 和 Python 代码?

扩展通过 Boost.Python 公开的虚拟 C++ 类

使用boost.python,如何扩展类的__dir__函数?