首页 > 编程语言 >Python调用C/C++动态库

Python调用C/C++动态库

时间:2023-06-13 18:33:58浏览次数:53  
标签:调用 lib Python C++ dll int Add ctypes python

一、编译C++代码并封装成动态库

1、创建编译dll文件的项目,在上面的官网介绍的更详细,这里就不多做介绍了。注意在vs之中新建一个项目,项目选择动态链接库(DLL)

2、2.在源文件中添加cpp文件并写好函数

#include<iostream> 

#define MATHLIBRARY_API extern "C" __declspec(dllexport)   //主要就是加入这个宏定义

MATHLIBRARY_API int add(int x, int y)   //在自己的函数前面加上定义的宏名,在编译成dll文件时就能将该函数加入动态链接库
{
    return x + y;
}

class Test
{
public:
    int Add(int a, int b);
};

int Test::Add(int a, int b) {
    return a + b;
}

//调用类的情况
MATHLIBRARY_API int Add(int a, int b) {
    Test test;
    int sum = test.Add(a, b);

    return sum;
}


//不调用类
MATHLIBRARY_API int Sum(int a, int b){

    return a + b;
}

3、根据自己的系统及需要选择平台,然后生成解决方案即可。我的python是64位的,所以选择x64。若不匹配,在python端调用该dll文件就会报错。

4、如果生成成功,则在该项目的路径下会产生一个x64的文件夹,在该文件夹的debug里面就有dll文件,至此生成动态链接库就完成了。打开VS2019的 developer powershell输入下面命令就能查看到该dll文件内有哪些函数:

dumpbin /exports  绝对路径(C:\Users\source\repos\Mathlibrary\x64\Debug\Mathlibrary.dll)

二、Python调用动态链接dll

Python调用dll文件需要用到ctypes库,这个库并不需要下载,python3就已经自带了。将生成的dll文件复制到python项目下,一定要和调用dll文件的python文件在同一个目录下。

#!/usr/bin/python3
#!--*-- coding: utf-8 --*--
import ctypes

#加载动态链接库
lib = ctypes.cdll.LoadLibrary("F:\\Python_C\\x64\\Debug\\Python_C.dll")

lib.Add.argtypes = [ctypes.c_int, ctypes.c_int]     # 对C++库在python中的实例进行进一步的输入参数类型的定义
lib.Add.restype = ctypes.c_int                         # 对C++库在python中的实例进行进一步的输出类型的定义

lib.Sum.argtypes = [ctypes.c_int, ctypes.c_int]     
lib.Sum.restype = ctypes.c_int         

result0 = lib.add(1, 2)        #也可以不定义输出、输出参数类型,但输入类型要符合定义
result1 = lib.Add(3, 4)
result2 = lib.Sum(5, 6)
result3 = lib.add(ctypes.c_int(1.345), ctypes.c_int(2.232))    
print(result0, result1, result2)

所以利用ctypes调用dll动态链接库需要注意C/C++函数传入变量的数据类型。下面给大家列出了ctypes、C/C++、python对应的数据类型,大家按照自己函数的需要转换类型:

 

标签:调用,lib,Python,C++,dll,int,Add,ctypes,python
From: https://www.cnblogs.com/okmai77xue/p/17478433.html

相关文章

  • go调用minio上传文件
    1packagemain23import(4"context"5"fmt"6"log"7"os"89"github.com/minio/minio-go/v7"10"github.com/minio/minio-go/v7/pkg/credentials"11)1213......
  • Python基础之subprocess模块、hashlib模块、日志模块
    subprocess模块tasklist:列举出来文件进程命令"""1.以后我们可以用自己的电脑连接上别人的电脑(socket)2.通过subprocess可以在别人的计算机上执行我们想要执行的命令3.把在别人计算机上执行的结果给返回过来"""importsubprocessimportsubprocessres=subprocess.P......
  • python 之logging 模块
    一、日志的简单使用1、什么是日志记录你的代码在执行过程中的一些变化(记录的是一些有意义的变化)2、日志的5个等级importlogginglogging.debug('debugmessage')#10logging.info('infomessage')#20logging.warning('warningmessage')#30logging.error('errorm......
  • python 3.11.4 安装教程
    python官网 WelcometoPython.org.1.下载python进入官网点击Downloads找到3.11.4版本 点击Download  找到对应的电脑版本进行下载 2.安装python(1)双击下载好的python-3.11.4-amd64.exe(2)勾选AddPython3.7toPATH,再点击CustomizeinstallationInstallno......
  • C++之继承(万字长文详解)
    继承继承的概念继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,继承......
  • Python和Anaconda的版本对应关系
    原文链接Python和Anaconda的版本对应关系如下:PackagesincludedinAnaconda2022.10for64-bitLinuxonx86_64CPUswithPython3.10PackagesincludedinAnaconda2022.10for64-bitLinuxonARMv8CPUswithPython3.10PackagesincludedinAnaconda2022.10for6......
  • C++销售管理助手[2023-06-13]
    C++销售管理助手[2023-06-13]用c++线性结构写一个完整程序,题目如下小美学完线性表后,想设计一个小程序,管理自己的网店销售情况,她想实现以下功能,请设计程序帮她实现:(1)可以录入商品信息,格式如下:(商品编号、商品名称、数量、进价、标价、折扣、售价)样例:(c0001,海飞丝,40,20,30......
  • pycharm打包python项目为exe执行文件
    1.先把所有需要用到的,引用的文件放在同一个文件夹(新建)下面,修改主要2.生成.spec文件,根据这个文件来生成exe可执行文件。生成.spec的命令如下:pyi-makespecXXX.py命令,这里XXX.py为主程序文件,该命令会生成一个XXX.spec文件;如果需要使用ico,则可以使用pyi-makespecXXX.py-imyicon......
  • 微信公众号开发C#系列-4、获取接口调用凭证
    本文目录概述怎么获取access_token?实现方式参考文章概述获取接口调用凭证实质就是获取access_token。在微信接口开发中,许多服务的使用都离不开AccessToken,AccessToken相当于打开这些服务的钥匙,正常情况下会在7200秒内失效,重复获取将导致上次获取的Token失效,本文将首先介绍如何......
  • C++ Builder 初学问与答(二)
     2.文本输入组件11)问:如果要实现文本输入,在C++Builder中应该怎么办? 答:C++Builder常用文本输入组件来实现,常用的文本输入组件有Edit、MaskEdit、Memo和RichEdit。他们的主要不同在于Edit和MaskEdit用于输入单行文本,而Memo和RichEdit可以输入多行文本。此外Label组件也可用来进行......