徐高翔的个人网站

python调用C函数windows版

2017-09-21

软硬件环境

  • Windows 10
  • anaconda3 with python 3.6.4
  • visual studio 2015

Visual Studio编译dll

在需要抛出的方法前加入__declspec(dllexport), 比如下面C代码

1
2
3
4
5
6
7
8
9
10
__declspec(dllexport) unsigned int crc32( const unsigned char *s, unsigned int len)
{
unsigned int i;
unsigned int crc32val=0xffffffff;
printf("len==%d\n",len);
for (i = 0; i < len; i ++)
crc32val = crc32_tab[(crc32val ^ s[i]) & 0xff] ^ ((crc32val >> 8)&0x00FFFFFF);

return ~crc32val;
}

然后打开VS X64工具命令行提示符,进入到C源码目录,分别执行以下两条命令,第一条命令是生成目标文件.obj,第二天命令是链接目标文件,生成动态库。

1
2
cl /c crc.c
link /dll crc.obj

至此,dll文件就生成了,它就是我们需要的动态链接库。

python调用dll

这个跟linuxpython调用so库是一样的,可以参考之前的文章 https://blog.xugaoxiang.com/python/python3-call-dynamic.html, 这里就不多说了。

碰到的坑

调用时报错

1
2
3
4
5
6
7
8
9
  File "client.py", line 35, in <module>
data_crc = CRC.calcStrCRC(recv_buffer[20:], recv_buffer[8] - 14)
File "D:\longjing\clientdemo\crc.py", line 33, in calcStrCRC
handle = cdll.LoadLibrary('crc.dll')
File "D:\tools\anaconda3\lib\ctypes\__init__.py", line 426, in LoadLibrary
return self._dlltype(name)
File "D:\tools\anaconda3\lib\ctypes\__init__.py", line 348, in __init__
self._handle = _dlopen(self._name, mode)
OSError: [WinError 193] %1 不是有效的 Win32 应用程序。

确保dll64位的,python也是64位的

参考资料

推荐文章(由hexo文章推荐插件驱动)

使用支付宝打赏
使用微信打赏

请博主喝咖啡!