使用 python CDLL 加载 dll,但没有出现来自 c 代码的函数

Using python CDLL to load dll, but no function from c code show up

我正在尝试将用 C 代码编写的函数导入 python。我试过的一个最小的例子是

//test.h
__declspec(dllexport)  int HW(int, int);
//test.c
#include <stdio.h>
#include <stdlib.h>
#include "test.h"

__declspec(dllexport) int HW(int a, int b)
{
    return a + b;
}

我还尝试删除任一文件中的 __declspec(dllexport)。然后我在 Visual Studio 2019 CMD

中做了以下操作
cl /LD test.c

cl /LD test.c \libs\python37.lib

在python我做到了

from ctypes import *
a = CDLL('test.dll')

原来HW不是a的属性。我哪里做错了?

您至少需要以下代码。 test.h 不需要导出函数,也没有使用其他包含。

__declspec(dllexport) int HW(int a, int b)
{
    return a + b;
}

使用 cl /LD test.c (Microsoft) 编译。 python 库不是必需的。如果使用 32 位 Python,请确保使用 32 位编译器;如果使用 64 位 Python.

,请确保使用 64 位编译器

使用演示:

>>> from ctypes import *
>>> a = CDLL('./test')
>>> a.HW
<_FuncPtr object at 0x000001E44AB7BA00>
>>> a.HW(1,2)
3

请注意,在您访问函数一次之前,您不会通过检查(即 dir(a))看到这些函数:

>>> from ctypes import *
>>> a = CDLL('./test')
>>> dir(a)
['_FuncPtr', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattr__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_func_flags_', '_func_restype_', '_handle', '_name']
>>> a.HW
<_FuncPtr object at 0x0000020A92B7B930>
>>> dir(a)
['HW', '_FuncPtr', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattr__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_func_flags_', '_func_restype_', '_handle', '_name']