日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

使用boost.python进行混合开发

發布時間:2023/12/31 python 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用boost.python进行混合开发 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

使用boost.python進行混合開發

原文請參照官網和各方參考,本文有改動!

參考鏈接:http://blog.csdn.net/lanbing510/article/details/12197901


引言:

1??簡介:

Boost.Python ?Boost的一個組件。而?Boost是目前很紅火的準?C++標準庫,它提供了很多組件使得人們可以用?C++語言更方便地實現更多的功能。 Boost.Python就是?Boost眾多組件中的一個。但它是個特例,它的目的不是單純地增強?C++語言的功能,而是希望利用?C++語言來增強?Python語言的能力。使用?Boost.Python庫,我可以方便地將?C++語言寫的程序庫用于?Python語言,可以用?Python更好地完成更多的任務。

好吧,我承認,我忘了說很重要的一點。那就是,通過?Boost.Python,我們不僅僅可以用?C++來擴展?Python,我們還可以將?Python嵌入?C++。其實?Python運行環境本身就提供了一套嵌入?Python到其它語言的?API,不過是?C語言寫的。有了這套?API,我們就完全可以將?Python嵌入到?C/C++語言程序中去。但是,由于?Python本身是一門面向對象的、動態類型的語言,還帶垃圾收集,而?C是個面向過程的、靜態類型的、不帶垃圾收集的程序設計語言。因此,直接使用這套?C?API非常痛苦。 Boost.Python用面向對象 +模板的方法將這套?C?API重新包裝了一下,我們用起來就清爽多了。不過,目前這個包裝還不完善,因此可能還是需要直接使用一部分?Python?C?API。等它長大了我再來介紹它。

1.1??Boost.Python的特性

目前?Boost.Python 特性包括: o???????????支持?C++引用和指針 o???????????Globally Registered Type Coercions o???????????自動跨模塊類型轉換 o???????????高效的函數重載 o????????????C++異常到?Python異常的轉化 o???????????參數默認值 o???????????關鍵字參數 o????????????C++程序中訪問?Python語言中的對象 o???????????導出?C++迭代器為?Python迭代器 o???????????文檔字符串


1.2??跟其它工具的比較

目前有多個工具可以實現跟?Boost.Python類似的功能,如?SWIGSIP等。但是它們有很大的不同。SWIG?SIP都定義了一種接口描述語言。我需要先寫一個接口描述文件,用于描述我要導出的?C++函數和類。然后通過一個翻譯器,將接口描述文件翻譯成?C++程序。最后編譯連接生成的?C++程序來生成擴展庫。而?Boost.Python用于導出?C++函數和類的時候,我需要添加的也是?C++的代碼,這是?Boost.Python的最大特點之一。 SWIG 比較適合用來包裝?C語言程序,最近也開始增強一些對?C++的支持,但是到目前還不支持嵌套類等?C++特性。SIP似乎除了用在包裝?Qt庫之外,就沒幾個人用。而?Boost.Python可能是這三者之間對?C++支持最好的一個。不過?Boost.Python也有缺點,就是它使用了大量模板技巧,因此當要導出的元素比較多時,編譯非常慢。不過幸好作為膠水,我并不需要經常修改和重編譯,而且如果使用預編譯頭的話可以進一步提高編譯速度。 Boost.Python 的另外一個優點是,它的設計目標就是讓?C++程序庫可以透明地導出到?Python中去。即在完全不修改原來?C++程序的情況下,導出給?Python用。在這種設計理念下設計出來的?Boost.Python比同類工具支持了給完善的?C++特性,能夠最大程度地保證不修改原?C++程序。要知道貿然修改別人的程序,往往會帶來許多難以察覺的錯誤。


1.3. 進行環境搭建:Boost1.53 可以直接進行exe安裝,省去了編譯的麻煩;官網可下載 boost_1_53_0-msvc-10.0-64.exe


?????????????



2. 建立一個dll工程,命名為例如CSLIC:進行代碼練習


?? 2.1. 從最小的C函數開始

添加包含路徑和庫路徑之后,添加以下包含:

#include <boost/python.hpp> #include <boost/python/module.hpp> #include <boost/python/def.hpp> #include <boost/python/to_python_converter.hpp>void dummyFunc(){cout << "Dummy function called!" << endl; }
對應的Wrapper為: BOOST_PYTHON_MODULE(CSLIC) { def(fun, dummyFunc); }這里需要留意的是,對應的MODULE里邊的那個名字必須和 命名為例如CSLIC 里邊制定的庫 名字完全一樣,否則python導入對應的模塊時候會報錯誤。

關于第一次環境搭建,我們需要注意的有四點:

1.????????在編譯時,需要讓編譯器知道?Boost.Python?Python的頭文件所在目錄; 2.????????在連接時,需要讓連接器知道?Boost.Python?Python的庫文件所在目錄; 3.????????在連接時,讓連接器知道我們要生成的是動態連接庫,并且注意動態連接庫的主文件名要跟模塊名一致; 4.????????在運行?Python解釋器并裝入?Baby模塊時,需要在當前目錄或系統目錄下找得到?Boost.Python?Baby模塊對應的動態連接庫; 如果使用不同的操作系統、編譯器或者?IDE、不同版本的?Python運行環境或?Boost.Python庫,成功運行上面的例子需要的設置可能不同,但我們只要注意保證上面四點,應該不會有什么大問題。

2.2.? 構建類和結構體(一個小例子)

class Complex{public:double real;double imag;Complex(double rp,double ip);double GetArg()const;};使用以下膠水代碼來包裝:class_<Complex>("Complex", init<double,double>()).def_readwrite("real", &Complex::real).def_readwrite("imag", &Complex::imag).def("GetArg", &Complex::GetArg)

?? 膠水代碼的意思是,先構造一個臨時對象,該對象的類型是 init<double, double> (模板類 init的一個實例),然后用字符串?"Complex"這個臨時對象構造另一個臨時對象,該對象的類型是?class_<Complex> (模板類 class_的一個實例)。然后調用第二個臨時對象的?def_readwrite方法,該方法返回這個對象本身,因此可以接著再調用這個對象的?def_readwrite方法和?def方法。

?

一個完整的例子:

#include<cmath>#include<boost/python.hpp>//包含 Boost.Python的頭文件class Complex { //復數類public:double real; //表示實部的成員double imag; //表示虛部的成員//構造函數,以及初始化列表Complex(double rp,double ip):real(rp), //初始化實部imag(ip) { //初始化虛部}//獲取復數的幅角double GetArg()const{return atan2(imag, real);}};

usingnamespace boost::python; // 引入命名空間BOOST_PYTHON_MODULE(CSLIC) {//膠水代碼入口,導出一個名為“CSLIC”的模塊//構造一個類型為 "boost::python::class_<Complex>"的對象 pyComplex//構造參數為字符串 "Complex"//表示要將 C++類 Complex導出到 Python中去,名字也叫 "Complex"class_<Complex> pyComplex("Complex", no_init);//導出它的構造方法,聲明它的構造方法有兩個 double類型的參數pyComplex.def(init<double,double>());//導出它的公有成員 real,//該成員在 Complex類中的位置是 &Complex::real//導出到 Python中之后的名字也是 "real"pyComplex.def_readwrite("real", &Complex::real);//導出它的公有成員 imag,//該成員在 Complex類中的位置是 &Complex::imag//導出到 Python中之后的名字也是 "imag"pyComplex.def_readwrite("imag", &Complex::imag);//導出它的成員方法 GetArg//該方法在 Complex類中的入口是 &Complex::GetArg//導出到 Python中之后的名字也是 "GetArg"pyComplex.def("GetArg", &Complex::GetArg);}

生成動態連接庫 ADT.so (Linux) ADT.dll (Windows)。然后我可以執行一段?Python腳本來驗證一下:


我遇到的問題

??? (1):對于函數重載:產生模板庫不能展開問題 ErrorC2784,ErrorC2780

??? 解決方法:消除重載,函數改名......

下邊的是一個成員函數重載的例子(其實和Free funciton的唯一差別就是聲明導出的時候,要在class_<T>對象的那個.后邊加def,而一般函數只要直接Def即可): //Overloadding struct X{ bool f(int a){return true;} bool f(int a, double b) {return true;} bool f(int a, double b, char c){return true;} int f(int a, int b, int c){return a + b + c;}; };

聲明的時候,則要費時一點:

//helpersbool (X::*fx1)(int) = &X::f;bool (X::*fx2)(int, double) = &X::f;bool (X::*fx3)(int, double, char)= &X::f;int (X::*fx4)(int, int, int) = &X::f;class_<X>("X").def("f", fx1).def("f", fx2).def("f", fx3).def("f", fx4)

?

(2):對于不能正常初始化問題:利用WIndepends查看后,缺少兩個com組件;

????????? 打開dll文件,發現:

錯誤: 由于在隱性依賴模塊中丟失導出函數,至少有一個模塊有不能解析的導入。
錯誤: 發現不同 CPU 類型的模塊。
警告: 至少有一個延時加載模塊沒找到。
警告: 由于在延時加載依賴模塊中丟失導入函數,至少有一個模塊具有不能解析的導入。


???? 由于VS對64位os的支持不完善,導致大量使用32位庫,造成不兼容;


??? 解決方法: 切換到32位平臺


總結

以上是生活随笔為你收集整理的使用boost.python进行混合开发的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 一道本视频在线 | 成人精品视频 | 国内视频一区 | 国产一区,二区 | 男女激情四射网站 | 欧洲一区二区三区 | 日日影院| 免费一级特黄 | 日韩1区 | 日本啪啪网 | 欧美做爰xxxⅹ性欧美大片 | 欧美一区,二区 | 免费在线小视频 | 欧美精品另类 | 国产精品2019 | 天天干天天舔天天射 | 国产一卡在线 | 一区二区乱码 | 就要操就要射 | 国产精品911| 草久久免费视频 | 欧美区二区三区 | 成人黄色一级 | 中文字幕avav | 两性囗交做爰视频 | 蜜臀va| 麻豆一区产品精品蜜桃的特点 | 天天色播 | 亚洲久操| 男人猛吃奶女人爽视频 | 欧美成人免费在线观看 | 色视频一区二区 | 久久婷婷色 | 久草精品视频 | jizz国产免费 | 久久久久国产精品无码免费看 | 国产精品va无码一区二区 | 久久成人综合网 | 欧美在线一区二区 | 欧美国产日韩精品 | 欧美美女性视频 | 国产第三页 | 成人不卡视频 | 国产日韩精品一区二区三区 | 一级女性全黄久久生活片免费 | 伊人成年综合网 | 久久经典| 91tv在线观看 | 丰满少妇av| 国产娇小hdxxxx乱 | 三级黄色图片 | 亚洲国产成人av | 国产艳妇疯狂做爰视频 | 亚洲aⅴ| 91免费高清 | 亚洲砖区区免费 | 日韩国产一级 | 亚洲图片 欧美 | 91在线高清 | 亚洲国产精品18久久久久久 | 激情视频亚洲 | 国产精品第四页 | 成都免费高清电影 | 夜色资源网 | 九九视频在线免费观看 | 中国a一片一级一片 | 精品国产1区 | 欧美熟女一区二区 | 第一章豪妇荡乳黄淑珍 | 真人毛片97级无遮挡精品 | 三级视频黄色 | 成年人毛片视频 | 人与动物2免费观看完整版电影高清 | 欧美成人国产va精品日本一级 | 一区二区国产欧美 | 东北少妇不戴套对白第一次 | 亚洲一区在线观看视频 | 91av在线播放 | 亚洲av色香蕉一区二区三区 | 手机看片1024久久 | 亚洲美女性视频 | 岛国二区| 手机av免费看| 在线1区| 日韩精品第一 | 高清不卡一区 | 色综合九九 | 久久成人激情 | 欧美另类综合 | 国产精品亚洲αv天堂无码 伊人性视频 | 手机av电影在线 | 日韩骚片 | 综合色吧| 久草超碰| 亚洲一级av毛片 | 午夜性福利 | www.人人草| 国产伊人网 | 曰批又黄又爽免费视频 |