Boost.Python教程:导出函数

26 篇文章 0 订阅

目录

快速开始

建立Hello World

暴露类

构造函数

类的数据成员

类属性

遗产

类虚函数

具有默认实现的虚函数

类操作符/特殊功能

功能

呼叫政策

超载

默认参数

自动重载

对象接口

基本界面

派生对象类型

提取C ++对象

枚举

PyObject *创建boost :: python :: object

嵌入

使用解释器

迭代器

例外翻译

一般技术

创建包

在Python中扩展包装对象

缩短编译时间

快速开始

Boost Python Library是一个用于连接Python和C ++的框架。 它允许您快速无缝地将C ++类函数和对象公开给Python,反之亦然,不使用特殊工具 - 只需使用C ++编译器。 它旨在非侵入性地包装C ++接口,因此您不必更改C ++代码以包装它,使Boost.Python成为将第三方库公开给Python的理想选择。 该库使用高级元编程技术简化了用户的语法,因此包装代码具有一种声明性接口定义语言(IDL)的外观。

Hello World

遵循C / C ++传统,让我们从“你好,世界”开始吧。 一个C ++函数:

char const* greet()
{
   return "hello, world";
}

在使用的过程中经常会返回获取的字符串,如果使用上面的方法会导致返回的字符串是乱码,非法指针

虽然官网给出的是char * 类型,这个只适用于返回的是字符串常量,如果返回的是string变量需要使用下面的方法。但是博主建议用的时候还是用std::string。

std::string greet()
{
   return "hello, world";
}

可以通过编写Boost.Python包装器来暴露给Python:

#include <boost/python.hpp>

BOOST_PYTHON_MODULE(hello_ext)
{
    using namespace boost::python;
    def("greet", greet);
}

而已。 我们完成了。 我们现在可以将其构建为共享库。 现在可以看到生成的DLL。 这是一个Python会话示例:

>>> import hello_ext
>>> print hello_ext.greet()
hello, world

注意事项: 操作过程遇到的工程问题

1、默认情况下,python库是动态链接的,需要定义一个静态链接的宏,BOOST_PYTHON_STATIC_LIB

否则会报: fatal error LNK1104: 无法打开文件“boost_python-vc140-mt-gd-1_61.lib”,这个是链接动态库的情况

2、生成的c++动态库dll,python怎么导入呢,官方教程里没有给出具体方法,直说可见

把dll的后缀改成pyd,再导入就可以直接用了

3、报找不到模块错误:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ModuleNotFoundError: No module named 'PYWrapper'

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: dynamic module does not define module export function (PyInit_PYWra
pper)

BOOST_PYTHON_MODULE中模块名称必须跟pyd的动态库名称一致。

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

道格拉斯范朋克

播种花生牛奶自留田

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值