// func.c
#ifdef _MSC_VER
#define DLL_EXPORT __declspec( dllexport )
#else
#define DLL_EXPORT
#endif
DLL_EXPORT int add(int a,int b)
{
return a+b;
}
DLL_EXPORT void print_s(const char* s)
{
printf("Hello %s", s);
}
编译:cl /LD func.c /o func.dll
// func.c
int add(int a,int b)
{
return a+b;
}
double *update(double a[], int n)
{
double *b = (double *)malloc(n*sizeof(double));
for (int i = 0; i < n; ++i)
{
b[i] = a[i] * 0.0098;
}
return b;
}
void print_s(const char* s)
{
printf("Hello %s", s);
}
编译:gcc func.c -shared -o func.dll
from ctypes import *
dll = CDLL("func.dll")
dll.add(23, 33)
length = dll.print_s(c_char_p(bytes("Andy", "utf8")))
print(length)
arr = (c_double*5)()
arr[0] = 100
arr[1] = 200
arr[2] = 300
arr[3] = 200
arr[4] = 200
res_p = dll.update(arr, len(arr))
result = cast(res_p, POINTER(c_double*len(arr)))
for item in result.contents:
print(item)
out:
56
Hello Andy
10
0.98
1.96
2.94
1.96
1.96
一定要注意你用的Python 是多少位的(32/64位),还有你使用的编译器是多少位的,一定要对应。
否则会报错:不是有效的32位程序
,32位 python 用不了64位的 dll, 64位 python 也用不了32 位的dll
我就被这个折腾了好久