zoukankan      html  css  js  c++  java
  • python引用C++ DLL文件若干解释及示例

    python引用C++ DLL文件若干解释及示例

    首先说一下,python不支持C++的DLL,但是支持C的DLL;C++因为和C兼容可以编译为C的DLL,这是下面文章的背景与前提


    首先我这儿的示例使用VS2017编译的DLL,先讲过程,再解释

    第一步,新建DLL项目

    在这里插入图片描述

    确定之后我们可以看到默认的文件

    在这里插入图片描述

    这时候我们需要新建一个与Test.cpp对应的头文件
    在这里插入图片描述

    这是完成之后的代码结构
    在这里插入图片描述

    下面是Test.h文件的内容和Test.cpp文件的内容及相应解释

    // Test.cpp : 定义 DLL 应用程序的导出函数。
    //
    
    #include "stdafx.h"
    #include "Test.h"
    
    bool Test1()
    {
    	return true;
    }
    
    bool Test2()
    {
    	return false;
    }
    

    首先我们需要引用Test.h,也就是我们刚刚建立的与之匹配的头文件

    Test1和Test2就是我们写的python需要调用的函数,因为python在调用DLL时除了int型其他的返回类型都需要指定,所以我用bool来展示

    //Test.h
    
    
    #pragma once
    extern "C" __declspec(dllexport) bool Test1();
    extern "C" __declspec(dllexport) bool Test2();
    

    这是我们建立的头文件

    第一行VS自动生成,不用管它,它的作用是保证头文件只被编译一次

    第二行和第三行就是我们要添加的代码,这两行就是我们定义的函数,有点像以前学C语言的时候老师说的定义在main函数后面的函数要在前面先写一次,记住这个形式就好了。我来讲讲前面的代表什么意思

    • extern “C”

    这个的意思是声明的函数可以被其他模块调用,并且编译为C文件

    • __declspec(dllexport)

    这是MS VC中专用的关键字,表示将函数、类等声明为导出函数,供其他程序调用

    这两个加起来添加到头文件里,声明的函数编译出来就可以被python调用了

    python调用方法也很简单

    from ctypes import *
    dll = CDLL("Test.dll")
    dll.Test1.restype = c_bool
    # restype是函数的返回类型,c_bool代表返回bool类型,这里的对应关系就自己查一下了
    # 除了restype还有argtypes,代表函数的参数类型
    print(dll.Test1())
    

    整体大致就是这样了,如果没成功可以给我留言看看,我也是个新手,最近因为一个项目才用到Python,如果有什么不对的请批评指正

    关于ctypes的部分,主要参考了这篇博文,感谢”无尽的数字眩晕症“

    https://www.cnblogs.com/night-ride-depart/p/4907613.html

  • 相关阅读:
    Linux五种IO模型
    怎样理解阻塞非阻塞与同步异步的区别?
    .NET 框架 (转载)
    数组 反转
    排序 归并排序&逆序对
    快速寻找满足条件的2个数
    数组 寻找最大的第k个数
    字符串 删除字符串开始以及末尾的空白符,并把数组中间的多个空格(如果有)符转换为1个
    排序 快速排序
    java8常用api
  • 原文地址:https://www.cnblogs.com/wujuncheng/p/13388957.html
Copyright © 2011-2022 走看看