視頻教程:boost::python庫的編譯和使用的基本方法
- boost::python用于將C++的函數(shù)和對(duì)象導(dǎo)出,方便python調(diào)用對(duì)象和方法,用來實(shí)現(xiàn)C++和Python的混合編程。
編譯boost::python庫
- 下載boost源碼,解壓到想放到的位置,例如: E:\Learning\Boost\boost_1_69_0
- 編譯boost的lib庫
- 查看VS的版本斋枢,打開任意工程:VS->Project->Properties::Genneral::Plateform Toolset(VS2015為v140)
- 在開始菜單的VS菜單項(xiàng)里打開“Developer Command Prompt for VS2015”,進(jìn)入boost目錄
- 運(yùn)行bootstrap.bat知给,會(huì)在根目錄下生產(chǎn)bjam.exe瓤帚,b2.exe(bjam的升級(jí)版),project-config.jam涩赢,bootstrap.log四個(gè)文件
- 編譯boost::python庫(VS2015)
//boost::python lib
bjam toolset=msvc-14.0 --with-python threading=multi link=static address-model=64
//--with-python 里面的python需要是python3版本戈次,要求系統(tǒng)能找到你的python,直接在cmd里面輸入python能彈出python3說明沒有問題
- 生成的lib在boost的stage文件夾下筒扒,也可以復(fù)制出來怯邪,放入到統(tǒng)一的地方,方便其他程序調(diào)用
VS工程的配置花墩,編譯和基礎(chǔ)示例
- VS2015建立名為Boost_Python_Sample的Win32的dll工程
- VS2015也可建立一個(gè)Win32 Console Applicantion悬秉,然后在VS->Project->Properties::Genneral::Configuration Type里改成dll
- 工程設(shè)置(Project->Properties->VC++ Directories)
- Include Diretorise加上Boost根目錄
- Include Diretorise加上Python的include目錄
- Library Diretoties加上boost編譯出來的lib目錄
- Library Diretoties加上Python的libs目錄
-
Python_Test_Sample為導(dǎo)出的模塊dll澄步,可直接將輸出程序的后綴名改成pyd
-
因?yàn)槭褂玫氖庆o態(tài)編譯的boost::python庫,所以在include頭文件之前要加上BOOST_PYTHON_STATIC_LIB搂捧,因?yàn)樵赽oost::python庫的config.hpp中規(guī)定驮俗,如沒定義BOOST_PYTHON_STATIC_LIB 懂缕,則采用動(dòng)態(tài)編譯的庫
#ifdef BOOST_PYTHON_STATIC_LIB
# define BOOST_PYTHON_STATIC_LINK
# elif !defined(BOOST_PYTHON_DYNAMIC_LIB)
# define BOOST_PYTHON_DYNAMIC_LIB
#endif
- 示例代碼
#define BOOST_PYTHON_STATIC_LIB
#include <boost/python.hpp>
#include <iostream>
struct StructionData
{
void hello()
{
std::cout << "hello, this is boost::python sample!" << std::endl;
}
void printmsg()
{
std::cout << "print message done!" << std::endl;
}
};
BOOST_PYTHON_MODULE(Boost_Python_Sample)
{
//struct
boost::python::class_<StructionData>("StructionData")
.def("hello", &StructionData::hello)
.def("printmsg", &StructionData::printmsg);
}
//Boost_Python_Sample為導(dǎo)出的模塊名
//StructionData為類名
//hello和printmsg是成員函數(shù)名
導(dǎo)出的模塊名需要和生成的pyd文件名相同
- 將pyd文件拷貝到python的庫目錄下(python —>lib —>site-packages)允跑,或者命令行直接進(jìn)入pyd所在的目錄。
- 命令行進(jìn)入python搪柑,導(dǎo)入并調(diào)用pyd的導(dǎo)出模塊和函數(shù)