用boost封装C++的库供Python调用

4 篇文章 0 订阅
2 篇文章 0 订阅

用boost封装C++的库供Python调用

在网上查了一些教程,基本都是一些比较老的教程,在 boost 1.63.0 中无法使用,因此研读了boost的手册,一些笔记记录如下。

测试环境

dll工程配置

  • 添加boost和Python头文件路径:“D:\boost_1_63_0\;D:\Anaconda2\include ”
  • 添加boost和Python 链接器附加库目录: “D:\boost_1_63_0\lib64-msvc-14.0;D:\Anaconda2\libs ”
  • 添加boost和Python 附加库文件:

python27.lib
libboost_atomic-vc140-mt-1_63.lib
libboost_atomic-vc140-mt-gd-1_63.lib
libboost_atomic-vc140-mt-s-1_63.lib
libboost_atomic-vc140-mt-sgd-1_63.lib
libboost_bzip2-vc140-mt-1_63.lib
libboost_bzip2-vc140-mt-gd-1_63.lib
libboost_bzip2-vc140-mt-s-1_63.lib
libboost_bzip2-vc140-mt-sgd-1_63.lib
libboost_bzip2-vc140-s-1_63.lib
libboost_bzip2-vc140-sgd-1_63.lib
libboost_chrono-vc140-mt-1_63.lib
libboost_chrono-vc140-mt-gd-1_63.lib
libboost_chrono-vc140-mt-s-1_63.lib
libboost_chrono-vc140-mt-sgd-1_63.lib
libboost_chrono-vc140-s-1_63.lib
libboost_chrono-vc140-sgd-1_63.lib
libboost_container-vc140-mt-1_63.lib
libboost_container-vc140-mt-gd-1_63.lib
libboost_container-vc140-mt-s-1_63.lib
libboost_container-vc140-mt-sgd-1_63.lib
libboost_container-vc140-s-1_63.lib
libboost_container-vc140-sgd-1_63.lib
libboost_context-vc140-mt-1_63.lib
libboost_context-vc140-mt-gd-1_63.lib
libboost_context-vc140-mt-s-1_63.lib
libboost_context-vc140-mt-sgd-1_63.lib
libboost_coroutine-vc140-mt-1_63.lib
libboost_coroutine-vc140-mt-gd-1_63.lib
libboost_coroutine-vc140-mt-s-1_63.lib
libboost_coroutine-vc140-mt-sgd-1_63.lib
libboost_coroutine-vc140-s-1_63.lib
libboost_coroutine-vc140-sgd-1_63.lib
libboost_date_time-vc140-mt-1_63.lib
libboost_date_time-vc140-mt-gd-1_63.lib
libboost_date_time-vc140-mt-s-1_63.lib
libboost_date_time-vc140-mt-sgd-1_63.lib
libboost_date_time-vc140-s-1_63.lib
libboost_date_time-vc140-sgd-1_63.lib
libboost_exception-vc140-mt-1_63.lib
libboost_exception-vc140-mt-gd-1_63.lib
libboost_exception-vc140-mt-s-1_63.lib
libboost_exception-vc140-mt-sgd-1_63.lib
libboost_exception-vc140-s-1_63.lib
libboost_exception-vc140-sgd-1_63.lib
libboost_fiber-vc140-mt-1_63.lib
libboost_fiber-vc140-mt-gd-1_63.lib
libboost_fiber-vc140-mt-s-1_63.lib
libboost_fiber-vc140-mt-sgd-1_63.lib
libboost_filesystem-vc140-mt-1_63.lib
libboost_filesystem-vc140-mt-gd-1_63.lib
libboost_filesystem-vc140-mt-s-1_63.lib
libboost_filesystem-vc140-mt-sgd-1_63.lib
libboost_filesystem-vc140-s-1_63.lib
libboost_filesystem-vc140-sgd-1_63.lib
libboost_graph-vc140-mt-1_63.lib
libboost_graph-vc140-mt-gd-1_63.lib
libboost_graph-vc140-mt-s-1_63.lib
libboost_graph-vc140-mt-sgd-1_63.lib
libboost_graph-vc140-s-1_63.lib
libboost_graph-vc140-sgd-1_63.lib
libboost_iostreams-vc140-mt-1_63.lib
libboost_iostreams-vc140-mt-gd-1_63.lib
libboost_iostreams-vc140-mt-s-1_63.lib
libboost_iostreams-vc140-mt-sgd-1_63.lib
libboost_iostreams-vc140-s-1_63.lib
libboost_iostreams-vc140-sgd-1_63.lib
libboost_locale-vc140-mt-1_63.lib
libboost_locale-vc140-mt-gd-1_63.lib
libboost_locale-vc140-mt-s-1_63.lib
libboost_locale-vc140-mt-sgd-1_63.lib
libboost_log-vc140-mt-1_63.lib
libboost_log-vc140-mt-gd-1_63.lib
libboost_log-vc140-mt-s-1_63.lib
libboost_log-vc140-mt-sgd-1_63.lib
libboost_log-vc140-s-1_63.lib
libboost_log-vc140-sgd-1_63.lib
libboost_log_setup-vc140-mt-1_63.lib
libboost_log_setup-vc140-mt-gd-1_63.lib
libboost_log_setup-vc140-mt-s-1_63.lib
libboost_log_setup-vc140-mt-sgd-1_63.lib
libboost_log_setup-vc140-s-1_63.lib
libboost_log_setup-vc140-sgd-1_63.lib
libboost_math_c99-vc140-mt-1_63.lib
libboost_math_c99-vc140-mt-gd-1_63.lib
libboost_math_c99-vc140-mt-s-1_63.lib
libboost_math_c99-vc140-mt-sgd-1_63.lib
libboost_math_c99-vc140-s-1_63.lib
libboost_math_c99-vc140-sgd-1_63.lib
libboost_math_c99f-vc140-mt-1_63.lib
libboost_math_c99f-vc140-mt-gd-1_63.lib
libboost_math_c99f-vc140-mt-s-1_63.lib
libboost_math_c99f-vc140-mt-sgd-1_63.lib
libboost_math_c99f-vc140-s-1_63.lib
libboost_math_c99f-vc140-sgd-1_63.lib
libboost_math_c99l-vc140-mt-1_63.lib
libboost_math_c99l-vc140-mt-gd-1_63.lib
libboost_math_c99l-vc140-mt-s-1_63.lib
libboost_math_c99l-vc140-mt-sgd-1_63.lib
libboost_math_c99l-vc140-s-1_63.lib
libboost_math_c99l-vc140-sgd-1_63.lib
libboost_math_tr1-vc140-mt-1_63.lib
libboost_math_tr1-vc140-mt-gd-1_63.lib
libboost_math_tr1-vc140-mt-s-1_63.lib
libboost_math_tr1-vc140-mt-sgd-1_63.lib
libboost_math_tr1-vc140-s-1_63.lib
libboost_math_tr1-vc140-sgd-1_63.lib
libboost_math_tr1f-vc140-mt-1_63.lib
libboost_math_tr1f-vc140-mt-gd-1_63.lib
libboost_math_tr1f-vc140-mt-s-1_63.lib
libboost_math_tr1f-vc140-mt-sgd-1_63.lib
libboost_math_tr1f-vc140-s-1_63.lib
libboost_math_tr1f-vc140-sgd-1_63.lib
libboost_math_tr1l-vc140-mt-1_63.lib
libboost_math_tr1l-vc140-mt-gd-1_63.lib
libboost_math_tr1l-vc140-mt-s-1_63.lib
libboost_math_tr1l-vc140-mt-sgd-1_63.lib
libboost_math_tr1l-vc140-s-1_63.lib
libboost_math_tr1l-vc140-sgd-1_63.lib
libboost_prg_exec_monitor-vc140-mt-1_63.lib
libboost_prg_exec_monitor-vc140-mt-gd-1_63.lib
libboost_prg_exec_monitor-vc140-mt-s-1_63.lib
libboost_prg_exec_monitor-vc140-mt-sgd-1_63.lib
libboost_prg_exec_monitor-vc140-s-1_63.lib
libboost_prg_exec_monitor-vc140-sgd-1_63.lib
libboost_program_options-vc140-mt-1_63.lib
libboost_program_options-vc140-mt-gd-1_63.lib
libboost_program_options-vc140-mt-s-1_63.lib
libboost_program_options-vc140-mt-sgd-1_63.lib
libboost_program_options-vc140-s-1_63.lib
libboost_program_options-vc140-sgd-1_63.lib
libboost_python-vc140-mt-1_63.lib
libboost_python-vc140-mt-gd-1_63.lib
libboost_python-vc140-mt-s-1_63.lib
libboost_python-vc140-mt-sgd-1_63.lib
libboost_python-vc140-s-1_63.lib
libboost_python-vc140-sgd-1_63.lib
libboost_random-vc140-mt-1_63.lib
libboost_random-vc140-mt-gd-1_63.lib
libboost_random-vc140-mt-s-1_63.lib
libboost_random-vc140-mt-sgd-1_63.lib
libboost_random-vc140-s-1_63.lib
libboost_random-vc140-sgd-1_63.lib
libboost_regex-vc140-mt-1_63.lib
libboost_regex-vc140-mt-gd-1_63.lib
libboost_regex-vc140-mt-s-1_63.lib
libboost_regex-vc140-mt-sgd-1_63.lib
libboost_regex-vc140-s-1_63.lib
libboost_regex-vc140-sgd-1_63.lib
libboost_serialization-vc140-mt-1_63.lib
libboost_serialization-vc140-mt-gd-1_63.lib
libboost_serialization-vc140-mt-s-1_63.lib
libboost_serialization-vc140-mt-sgd-1_63.lib
libboost_serialization-vc140-s-1_63.lib
libboost_serialization-vc140-sgd-1_63.lib
libboost_signals-vc140-mt-1_63.lib
libboost_signals-vc140-mt-gd-1_63.lib
libboost_signals-vc140-mt-s-1_63.lib
libboost_signals-vc140-mt-sgd-1_63.lib
libboost_signals-vc140-s-1_63.lib
libboost_signals-vc140-sgd-1_63.lib
libboost_system-vc140-mt-1_63.lib
libboost_system-vc140-mt-gd-1_63.lib
libboost_system-vc140-mt-s-1_63.lib
libboost_system-vc140-mt-sgd-1_63.lib
libboost_system-vc140-s-1_63.lib
libboost_system-vc140-sgd-1_63.lib
libboost_test_exec_monitor-vc140-mt-1_63.lib
libboost_test_exec_monitor-vc140-mt-gd-1_63.lib
libboost_test_exec_monitor-vc140-mt-s-1_63.lib
libboost_test_exec_monitor-vc140-mt-sgd-1_63.lib
libboost_test_exec_monitor-vc140-s-1_63.lib
libboost_test_exec_monitor-vc140-sgd-1_63.lib
libboost_thread-vc140-mt-1_63.lib
libboost_thread-vc140-mt-gd-1_63.lib
libboost_thread-vc140-mt-s-1_63.lib
libboost_thread-vc140-mt-sgd-1_63.lib
libboost_timer-vc140-mt-1_63.lib
libboost_timer-vc140-mt-gd-1_63.lib
libboost_timer-vc140-mt-s-1_63.lib
libboost_timer-vc140-mt-sgd-1_63.lib
libboost_timer-vc140-s-1_63.lib
libboost_timer-vc140-sgd-1_63.lib
libboost_type_erasure-vc140-mt-1_63.lib
libboost_type_erasure-vc140-mt-gd-1_63.lib
libboost_type_erasure-vc140-mt-s-1_63.lib
libboost_type_erasure-vc140-mt-sgd-1_63.lib
libboost_type_erasure-vc140-s-1_63.lib
libboost_type_erasure-vc140-sgd-1_63.lib
libboost_unit_test_framework-vc140-mt-1_63.lib
libboost_unit_test_framework-vc140-mt-gd-1_63.lib
libboost_unit_test_framework-vc140-mt-s-1_63.lib
libboost_unit_test_framework-vc140-mt-sgd-1_63.lib
libboost_unit_test_framework-vc140-s-1_63.lib
libboost_unit_test_framework-vc140-sgd-1_63.lib
libboost_wave-vc140-mt-1_63.lib
libboost_wave-vc140-mt-gd-1_63.lib
libboost_wave-vc140-mt-s-1_63.lib
libboost_wave-vc140-mt-sgd-1_63.lib
libboost_wserialization-vc140-mt-1_63.lib
libboost_wserialization-vc140-mt-gd-1_63.lib
libboost_wserialization-vc140-mt-s-1_63.lib
libboost_wserialization-vc140-mt-sgd-1_63.lib
libboost_wserialization-vc140-s-1_63.lib
libboost_wserialization-vc140-sgd-1_63.lib
libboost_zlib-vc140-mt-1_63.lib
libboost_zlib-vc140-mt-gd-1_63.lib
libboost_zlib-vc140-mt-s-1_63.lib
libboost_zlib-vc140-mt-sgd-1_63.lib
libboost_zlib-vc140-s-1_63.lib
libboost_zlib-vc140-sgd-1_63.lib

C++ demo源代码

// helloBoostPython.cpp : 定义 DLL 应用程序的导出函数。
//
#include "stdafx.h"

// 头文件引用
#include <boost/python.hpp>

/*******************************1、简单函数********************************/
char const* greet(){
       return "hello, world";
}

/*******************************2、简单类**********************************/
struct World{
       World(std::string msg) : msg(msg) {} // added constructor
       void setstr(std::string msg) { this->msg = msg; }
       std::string greet() { return msg; }
       std::string msg;

       std::string const name;
       float value;
       float get() { return this->value; }
       void set(float value) { this->value = value; }
};

/******************************3、继承和派生********************************/
struct Base { virtual ~Base() { ; } };
struct Derived : Base {};//继承于Base
void b(Base*);
void d(Derived*);
Base* factory() { return new Derived; }

/*******************************4、运算符重载********************************/
class FilePos { /*...*/ };
FilePos     operator+(FilePos, int) {}
FilePos     operator+(int, FilePos) {}
int         operator-(FilePos, FilePos) {}
FilePos     operator-(FilePos, int) {}
FilePos&    operator+=(FilePos&, int) {}
FilePos&    operator-=(FilePos&, int) {}
bool        operator<(FilePos, FilePos) {}

/****************************把C++程序封装为Python可调用的程序***************/
BOOST_PYTHON_MODULE(helloBoostPython){
       using namespace boost::python;

       /*******************************1、简单函数********************************/
       def("greet", greet);

       /*******************************2、简单类**********************************/
       class_<World>("World", init<std::string>())//init构造函数
              .def("greet", &World::greet)//不带参数的方法
              .def("setstr", &World::setstr)//带参数的方法
              .def_readonly("name", &World::name)//只读成员变量
              .def_readwrite("value", &World::value)//可读写成员变量
              .add_property("readonlyvalue", &World::get)//给Python中的类添加只读属性
              .add_property("value", &World::get, &World::set);//给Python中的类添加读写属性

       /******************************3、继承和派生********************************/
       //基类
       class_<Base>("Base");
       //继承的类
       class_<Derived, bases<Base> >("Derived");
       //关于继承的类的函数
       def("b", b);//基类指针作为参数的函数
       def("d", d);//派生指针作为参数的函数
       def("factory", factory);//返回值为派生类指针的函数

       /*******************************4、运算符重载********************************/
       class_<FilePos>("FilePos")
              .def(self + int())          // __add__
              .def(int() + self)          // __radd__
              .def(self - self)           // __sub__
              .def(self - int())          // __sub__
              .def(self += int())         // __iadd__
              .def(self -= other<int>())
              .def(self < self);          // __lt__
}

生成和调用

  • 生成工程,将生成的目标文件 “helloBoostPython.dll ”修改为 “helloBoostPython.pyd ”
  • 新建 hello.py ,测试代码
# -*- coding:utf-8 -*-
import helloBoostPython

# 简单函数
print helloBoostPython.greet()

# 简单类
planet = helloBoostPython.World("xm")
print planet.greet()

# 略...

更多用法参考boost docs

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值