如何使用C/C++為Python編寫DLL/SO
阿新 • • 發佈:2019-01-27
開門見山,直接闡述步驟。
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