Python调用 C语言生成的 dll 文件

Windows 系统

  • VC 编译器
// 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

  • gcc 编译器
// 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
我就被这个折腾了好久

你可能感兴趣的:(Python)