python用ctypes调用的windows上C++
我们在windows上实际演示ctypes的使用
提示:windows中以后缀名来区分文件类型,Linux中文件后缀名对系统无差别首先在vs2017中创建一个win32控制台应用程序,应用程序设置选择dll
和空项目
,如下图
创建typesdll.cpp
文件,编写代码如下
typesdll.cpp
//C++中编译c格式的函数,如果用C语言百衲衣不需要(文件后缀名.c)
// __declspec(dllexport) 函数导出到库中
#include <stdio.h>
extern "C" __declspec(dllexport)
void TestCtypes()
{
printf("In C TestCtypes\n");
}
编译生成testctypes.dll
文件,我们再创建一个testctypes.py
文件,
testctypes.py
from ctypes import *
# 导入库 windows中dll后缀名不用加
lib = CDLL("testctypes")
lib.TestCtypes()
运行上述pyhton程序,会报如下错误
OSError: [WinError 126] 找不到指定的模块。
这里我将dll文件拷贝到和testctypes.py
同一目录下,依然报错。将dll拷贝到和python.exe
统一目录下时,程序正常运行。使用os.chdir
将工作目录更改到当前目录,错误依旧。原因暂时还未找到
Linux
在windows中调用的是dll
动态链接库,在Linux中调用.so
动态链接库。
在liunx中代码的字符集是utf-8
,而在vs中对应的编码是gbk
。
我们用宏定义来实现源代码的跨平台,将typesdll.cpp
文件改为如下
typesdll.cpp
#include <stdio.h>
// 判断是否是windows WIN32
#ifdef _WIN32 //包含win32和win64
#define XLIB __declspec(dllexport)
#else
#define XLIB
#endif
extern "C" XLIB void TestCtypes()
{
printf("In C TestCtypes\n");
}
Reference: