1. 程式人生 > >如何使用C/C++為Python編寫DLL/SO

如何使用C/C++為Python編寫DLL/SO

開門見山,直接闡述步驟。

1. 新建一個原始碼檔案,裡面包含了返回兩個整數的和的函式

如果使用C語言,新建test.c檔案,並輸入以下內容:

// test.c
__declspec(dllexport) int sum(int a, int b) {
    return a + b;
}

如果使用C++語言,新建test.cpp檔案,並輸入以下內容:

// test.cpp
#define DLLEXPORT extern "C" __declspec(dllexport)

DLLEXPORT int sum(int a, int b) {
    return a + b;
}

如果使用Windows作業系統來開發,需要使用__declspec(dllexport)的宣告來說明這個函式是匯出的;如果使用Linux作業系統,則這個宣告省略。
extern "C"宣告避免編譯器對函式名稱進行name mangling,這對於使用C++來編寫DLL/SO是必須的。
為了提高可讀性和可複用性,強烈建議使用#define來定義一個匯出型別的巨集,正如上面的test.cpp程式碼所示。

2. 新建一個頭檔案(但不是必須的)

//test.h
int sum(int, int);

3. 編譯程式並生成DLL/SO

如果使用Windows作業系統,並安裝了Visual Studio的IDE,則可以建立一個新的Win32專案,並指定為DLL型別的空專案,然後將上面新建的兩個原始檔包含進去。最後編譯生成一個DLL,輸出為test.dll


如果使用Linux作業系統,使用以下命令來生成.so:
gcc -fPIC -c test.c
gcc -shared -o test.so test.o

4. 使用ctypes來載入DLL/SO

對於Windows,進入test.dll所在目錄,執行python,然後輸入以下命令:
>>> from ctypes import cdll
>>> mydll = cdll.LoadLibrary('test.dll')
>>> mydll
<CDLL 'test.dll', handle 10000000 at b92310>


對於Linux,執行python,然後輸入以下命令:
>>> from ctypes import cdll
>>> mydll = cdll.LoadLibrary('/home/leo/test.so')
>>> mydll
<CDLL '/home/leo/test.so', handle 9ba7d30 at b7e55d2c>
值得注意的是,在Linux中,載入的路徑需要指定為絕對路徑。

5. 可以使用mydll來計算兩個數的和

>>> mydll.sum(1, 4)
5

參考資料