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将工作目录更改到当前目录,错误依旧。原因暂时还未找到

注意:生成的dll的位数版本(x86或x64)要与所装python的位数版本一致

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:

  1. 关于win32控制台应用程序、win32项目、mfc项目、空项目
  2. 如何在VS2017中创建WIN32控制台程序
© liangqi all right reserved,powered by Gitbook文件修订时间: 2019-05-24

results matching ""

    No results matching ""