關于gcc編譯dll的我就不說了,網上舉例一大堆,下面以g++為例。
假設有一個test.cpp文件如下:
extern "C" {
__declspec(dllexport) double add(double x,double y);
}
double add(double x,double y){
return x+y;
}
在MinGW中使用g++編譯:
g++ -shared -Wl,--kill-at,--output-def,test.def -o test.dll test.cpp
在python中可以這樣調用生成的dll文件:
import ctypes
dll = ctypes.cdll.LoadLibrary('test.dll') #加載動態鏈接庫
f=dll.add #提取函數
f.argtypes=[ctypes.c_double,ctypes.c_double] #定義參數類型
f.restype=ctypes.c_double #定義函數返回值類型
f(2.5,3.5) #計算
顯示的結果為:
6.0
注意:加載的時候要根據你將要調用的函數是符合什么調用約定的。
stdcall調用約定:兩種加載方式
Objdll = ctypes.windll.LoadLibrary("dllpath")
Objdll = ctypes.WinDLL("dllpath")
cdecl調用約定:也有兩種加載方式
Objdll = ctypes.cdll.LoadLibrary("dllpath")
Objdll = ctypes.CDLL("dllpath")
下面的這個文章寫得不錯,還講到了結構體: