在函數(shù)聲明加入前綴,如
成都創(chuàng)新互聯(lián)-云計(jì)算及IDC服務(wù)提供商,涵蓋公有云、IDC機(jī)房租用、成都服務(wù)器托管、等保安全、私有云建設(shè)等企業(yè)級(jí)互聯(lián)網(wǎng)基礎(chǔ)服務(wù),服務(wù)電話:18980820575
__declspec(dllexport) int Fun(int a, int b)
否則在加載該dll時(shí)會(huì)提示找不到該符號(hào)
在windows下可以通過vs自帶的dumpbin工具查看可被調(diào)用符號(hào)
dumpbin /exports test.dll
C函數(shù)在調(diào)用過程中關(guān)于參數(shù)傳遞和壓棧由多種規(guī)定,作為dll提供給其他程序調(diào)用時(shí),必須明確并統(tǒng)一為同一種調(diào)用規(guī)定,否則會(huì)導(dǎo)致棧破壞,編譯器負(fù)責(zé)具體實(shí)現(xiàn)調(diào)用規(guī)定,主要有以下幾種調(diào)用規(guī)定
python下調(diào)用C庫(kù)有多種方式,ctypes是其中一種比較方便的,調(diào)用時(shí)首先需要加載dll文件,根據(jù)C dll的調(diào)用規(guī)定不同需要使用不同接口,使用ctypes需要 import ctypes 庫(kù)
對(duì)于簡(jiǎn)單的C函數(shù),例如 int add(int a, int b) , 此時(shí)就可以直接調(diào)用了,如
對(duì)于較復(fù)雜的C函數(shù)的參數(shù)情況,ctypes調(diào)用時(shí)對(duì)入?yún)⒑统霾妥鲆欢ㄌ幚?,這里分情況討論
以上包含了幾種主要的參數(shù)傳遞情況,ctypes也提供了一個(gè)較為完整的python類型和C類型的對(duì)照,如下:
if
__name__=="__main__":
'main'
當(dāng)腳本作為執(zhí)行腳本時(shí)__name__的值為__main__當(dāng)腳本作為模塊時(shí)__name__為模塊文件名。舉個(gè)例子,a.py作為執(zhí)行腳本時(shí)__name__的值是__main__。有2個(gè)腳本,a.py和b.py,a中引入b,執(zhí)行a.py時(shí),在b中模塊的__name__就是b.py
第一點(diǎn):語言類型不同
python是一種動(dòng)態(tài)類型語言,又是強(qiáng)類型語言。它們確定一個(gè)變量的類型是在您第一次給它賦值的時(shí)候。C是靜態(tài)類型語言,一種在編譯期間就確定數(shù)據(jù)類型的語言。大多數(shù)靜態(tài)類型語言是通過要求在使用任一變量之前聲明其數(shù)據(jù)類型來保證這一點(diǎn)的。
第二點(diǎn):對(duì)象機(jī)制不同
python中所有的數(shù)據(jù),都是由對(duì)象或者對(duì)象之間的關(guān)系表示的,函數(shù)是對(duì)象,字符串是對(duì)象,每個(gè)東西都是對(duì)象的概念。每一個(gè)對(duì)象都有三種屬性:實(shí)體、類型和值。C中沒有對(duì)象這個(gè)概念,只有數(shù)據(jù)的表示。
第三點(diǎn):變量類型不同
python六個(gè)標(biāo)準(zhǔn)的數(shù)據(jù)類型:Number數(shù)字、string字符串、List列表、Tuple元組、Sets集合、Dictionary字典,數(shù)字類型有四種類型:整數(shù)、布爾型、浮點(diǎn)數(shù)和復(fù)數(shù)。C語言也可分四類:基本類型、枚舉類型、void的類型、派生類型,基本類型:整數(shù)類型、浮點(diǎn)類型。
第四點(diǎn):函數(shù)庫(kù)的使用方法不同
在C語言中使用那個(gè)庫(kù)函數(shù),需要引入頭文件用include引入,而在python中需要引入別的模塊或者函數(shù)時(shí)需要用import引入。
兩者的不同機(jī)制是C語言中include是告訴預(yù)處理器,這個(gè)include指定的文件的內(nèi)容,要當(dāng)作本地源文件出現(xiàn)過,而python中的import可以通過簡(jiǎn)單的import引入,或者是import
numpy as np。
第五點(diǎn):全局變量不同
在C語言中,聲明全局變量,如果值是恒定的,那么可以直接用#define聲明,如果只是聲明全局,并且變量的值是可變的,那么直接類似int
a就可以了。
在python中,聲明全局變量時(shí),需要加上global,類似global a,在函數(shù)里面使用的時(shí)候需要先聲明global
a,否則直接用a那么python會(huì)重新創(chuàng)建一個(gè)新的本地對(duì)象并將新的值賦值給他,原來的全局變量的值并不變化。
(1)從Boost官方網(wǎng)站下載Boost庫(kù)源文件,將其解壓至某一目錄中。
(2)將Boost解壓至的目錄添加到VC++ 6.0的【Include files】中,
(3)進(jìn)入Boost目錄下的“l(fā)ibs\python\build\VisualStudio”子目錄中,在VC++ 6.0中打開其中的“boost_python.dsw”文件。
(4)單擊【Build】|【Batch Build】命令,分別編譯Boost.Python的Debug和Release版。
(5)編譯完成后將在Boost目錄下的“l(fā)ibs\python\build\bin-stage”子目錄中生成動(dòng)態(tài)鏈接庫(kù)和庫(kù)文件。由于使
用Boost.Python編寫的Python擴(kuò)展在運(yùn)行時(shí)根據(jù)版本不同需要“boost_python.dll”和
“boost_python_debug.dll”文件。為了方便,可以將其放到Windows安裝目錄下的“system32”目錄下。否則,需要將其
和Python擴(kuò)展放在同一目錄中。
(6)將Boost目錄下的“l(fā)ibs\python\build\bin-stage”子目錄添加到VC++ 6.0的【Library files】中,
完成上述設(shè)置后就可以使用Boost.Python編寫Python擴(kuò)展了。
使用Boost.Python擴(kuò)展和嵌入Python
通過Boost.Python可以在Python內(nèi)使用C++類和函數(shù)。和SWIG一樣Boost.Python簡(jiǎn)化了編寫Python擴(kuò)展的代碼,而不用使用Python/C API。但與SWIG不同,Boost.Python是一個(gè)類庫(kù),無需再使用接口文件。
初始化和方法列表
在Boost.Python中可以通過使用BOOST_PYTHON_MODULE來命名模塊名。在BOOST_PYTHON_MODULE中則可以使用def來實(shí)現(xiàn)使用Python/C API定義的方法列表。以下是一個(gè)簡(jiǎn)單的例子。
void show()
聲明show函數(shù)
{
cout "Boost.Python";
}
BOOST_PYTHON_MODULE(example)
使用BOOST_PYTHON_MODULE命名模塊名為“example”
{
def("show",show);
相當(dāng)于定義方法列表
以上就是對(duì)如何編譯Boost.Python以及如何使用Boost.Python擴(kuò)展和嵌入Python的相關(guān)的內(nèi)容的介紹,望你會(huì)有所收獲。
若你是想調(diào)用 c 編寫的DLL,可以使用ctypes調(diào)入使用;
#!/usr/bin/python
from?ctypes?import?*
import?os?
#需要使用絕對(duì)路徑
extest?=?cdll.LoadLibrary(os.getcwd()?+?'/DemoC.so')
或在windows下
#!/usr/bin/python
import?ctypes
import?os?
if?os.name?==?'nt':?#?windows系統(tǒng)
_lib_name?=?os.getcwd()?+?'/DemoC.DLL'
dl200_lib?=?ctypes.WinDLL(dl200_lib_name)
1、語言類型不同
Python是一種動(dòng)態(tài)類型語言,又是強(qiáng)類型語言;C語言是靜態(tài)類型語言,在編譯期間就確定數(shù)據(jù)類型的語言;
2、內(nèi)存管理不同
Python使用自動(dòng)垃圾收集器進(jìn)行內(nèi)存管理;C語言中程序員必須自己進(jìn)行內(nèi)存管理;
3、對(duì)象機(jī)制不同
Python所有的數(shù)據(jù),都是由對(duì)象或者對(duì)象之間的關(guān)系表示的,函數(shù)是對(duì)象,字符串是對(duì)象,每個(gè)東西都是對(duì)象的概念;C語言中沒有對(duì)象這個(gè)概念,只有數(shù)據(jù)的表示。
4、運(yùn)行效率不同
Python有一個(gè)GIL鎖,導(dǎo)致其對(duì)多線程支持不夠好,運(yùn)行速度比較慢;C語言比較快,是很好的底層語言,運(yùn)行效率上優(yōu)于Python。
5、變量類型不同
Python有六個(gè)標(biāo)準(zhǔn)的數(shù)據(jù)類型,包含Number數(shù)字、String字符串、List列表、Tuple元祖、Sets集合、Dictionary字典;數(shù)字類型有四種,包含:整數(shù)、布爾型、浮點(diǎn)數(shù)和復(fù)數(shù)。C語言也分為四大類,其中包含基本類型、枚舉類型、void的類型、派生類型,基本類型包含整數(shù)類型、浮點(diǎn)類型。
6、函數(shù)庫(kù)的使用方法不同
C語言中使用庫(kù)函數(shù),需要引入頭文件用include引入;Python中需要引入別的模塊或者函數(shù)時(shí)需要用import引入。