Python调用C++动态库详细步骤(附源码)

 更新时间:2025年05月19日 10:27:32   作者:鬼魅-9527  
在某些项目中需要在python工程中调用自定义的C++的动态库,分为以下两步,第一步:动态库生成;第二步:Python调用动态库,文章通过图文介绍的非常详细,需要的朋友可以参考下

一:直接调用C++库

第一步:动态库封装(vs2017+qt5.12.10)

1、新建工程时,一定要选择qt下的Qt Class Library 这个选项,如下图所示

2、工程创建成功后,可以在解决方案下看到有testLib.h、testLib.cpp和testlib_global.h三个基础的文件生成,如下图所示

3、下面我们简单写一个打印“vs2017+qt5.12.10生成动态库”的输出函数

testlib_global.h

#pragma once
 
#include <QtCore/qglobal.h>
#include <qDebug>
 
 
 
#ifndef BUILD_STATIC
# if defined(TESTLIB_LIB)
#  define TESTLIB_EXPORT Q_DECL_EXPORT
# else
#  define TESTLIB_EXPORT Q_DECL_IMPORT
# endif
#else
# define TESTLIB_EXPORT
#endif

testLib.h

#pragma once
 
#include "testlib_global.h"
 
class TESTLIB_EXPORT testLib
{
public:
    testLib();
 
	/**************************************************
	* @author 鬼魅-9527
	* @brief : 说明
	* @param-in: 无
	* @param-out : 无
	* @return : 无
	* @date : 2025-01-01
	**************************************************/
	bool PrintfString();
};
/*将接口转义供外部调用*/
extern "C"
{
	testLib obj;
	extern "C" _declspec(dllexport) bool __cdecl PrintfString()
	{
		return obj.PrintfString();
	}
}

testLib.cpp

#include "testLib.h"
 
testLib::testLib()
{
}
 
bool testLib::PrintfString()
{
	/*使用QStringLiteral,否则中文输出会乱码*/
	qDebug() << QStringLiteral("vs2017+qt5.12.10生成动态库");
 
	return true;
}

4、下面我们可以编译生成动态库

第二步:Python调用C++动态库

1、打开vs code 并在动态库目录下新建一个test.py文件

test.py

#导入Python调用c++的ctypes库
import ctypes
 
# 加载dll
my_dll = ctypes.CDLL("Z:/Demo/testLib/x64/Release/testLib.dll")
 
# 调用dll中的函数
my_dll.PrintfString()

2、通过终端执行Python test.py,如下所示

3、从输出结果可以看到提示加载库错误,这里出现错误的原因是,test.dll依赖的其他的库并没有找到,因此需要使用在test.dll目录下使用windeployqt打包test.dll依赖的库,如下图所示

3、再次在终端执行Python test.py,如下所示,调用动态库打印输出执行成功。

二:调用传递参数C++库

在大多数情况下,我们使用动态库调用时,都涉及参数传递,以下是简单的参数传递列子。

第一步:动态库封装

testlib_global.h

#pragma once
 
#include <QtCore/qglobal.h>
#include <qDebug>
 
 
 
#ifndef BUILD_STATIC
# if defined(TESTLIB_LIB)
#  define TESTLIB_EXPORT Q_DECL_EXPORT
# else
#  define TESTLIB_EXPORT Q_DECL_IMPORT
# endif
#else
# define TESTLIB_EXPORT
#endif

testLib.h

#pragma once
 
#include "testlib_global.h"
 
class TESTLIB_EXPORT testLib
{
public:
    testLib();
 
	/**************************************************
	* @author 鬼魅-9527
	* @brief : 打印
	* @param-in: 无
	* @param-out : 无
	* @return : 是否成功
	* @date : 2025-01-01
	**************************************************/
	bool PrintfString();
	/**************************************************
	* @author 鬼魅-9527
	* @brief : 参数传递
	* @param-in: num:数量,str;字符串
	* @return :字符串长度
	* @date : 2025-01-01
	**************************************************/
	int dataInputAndOutput(const int num, const char* str);
};
 
/*将接口转义供外部调用*/
extern "C"
{
	testLib obj;
	extern "C" _declspec(dllexport) bool __cdecl PrintfString()
	{
		return obj.PrintfString();
	}extern "C" _declspec(dllexport) int __cdecl dataInputAndOutput(const int num, const char* str)
	{
		return obj.dataInputAndOutput(num, str);
	}
}

testLib.cpp

#pragma once
 
#include "testlib_global.h"
 
class TESTLIB_EXPORT testLib
{
public:
    testLib();
 
	/**************************************************
	* @author 鬼魅-9527
	* @brief : 打印
	* @param-in: 无
	* @param-out : 无
	* @return : 是否成功
	* @date : 2025-01-01
	**************************************************/
	bool PrintfString();
	/**************************************************
	* @author 鬼魅-9527
	* @brief : 参数传递
	* @param-in: num:数量,str;字符串
	* @return :字符串长度
	* @date : 2025-01-01
	**************************************************/
	int dataInputAndOutput(const int num, const char* str);
};
 
/*将接口转义供外部调用*/
extern "C"
{
	testLib obj;
	extern "C" _declspec(dllexport) bool __cdecl PrintfString()
	{
		return obj.PrintfString();
	}extern "C" _declspec(dllexport) int __cdecl dataInputAndOutput(const int num, const char* str)
	{
		return obj.dataInputAndOutput(num, str);
	}
}

4、下面我们可以编译生成动态

第二步:Python调用C++动态库

test.py

#导入Python调用c++的ctypes库
import ctypes
 
# 加载dll
my_dll = ctypes.CDLL("Z:/Demo/testLib/x64/Release/testLib.dll")
 
# 调用dll中的函数
my_dll.PrintfString()
str1 = "Z:/Demo/testLib/x64/Release/testLib.dll"
str2 = my_dll.dataInputAndOutput(10,str1.encode("utf-8"))
print(str2);

通过终端执行Python test.py,如下所示

到此这篇关于Python调用C++动态库详细步骤(附源码)的文章就介绍到这了,更多相关Python调用C++动态库内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python pytesseract验证码识别库用法解析

    Python pytesseract验证码识别库用法解析

    这篇文章主要介绍了Python pytesseract验证码识别库用法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-06-06
  • 详解python的变量缓存机制

    详解python的变量缓存机制

    这篇文章主要介绍了python的变量缓存机制,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-01-01
  • 在Python开发环境中调用ChatGPT模型详细过程

    在Python开发环境中调用ChatGPT模型详细过程

    在开发过程当中时常需要使用 ChatGPT 来完成一些任务,但总是使用网页交互模式去 Web 端访问 ChatGPT 是很麻烦的,这时候我们可以使用代码来调用 ChatGPT 模型,本文将详细介绍在 Python 开发环境中调用 ChatGPT 模型过程,,需要的朋友可以参考下
    2023-05-05
  • 基于Python制作三款起床闹钟的示例代码

    基于Python制作三款起床闹钟的示例代码

    每天上班最痛苦的事情就是早起早起早起!这是大部分上班族的痛苦,但是不上班又是不可能的啦,因为都是为了搞钱。本文用Python制作了三款有趣的闹钟,感兴趣的可以学习一下
    2022-05-05
  • Python读取二进制文件代码方法解析

    Python读取二进制文件代码方法解析

    这篇文章主要介绍了Python读取二进制文件代码方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-06-06
  • typing.Dict和Dict的区别及它们在Python中的用途小结

    typing.Dict和Dict的区别及它们在Python中的用途小结

    当在 Python 函数中声明一个 dictionary 作为参数时,我们一般会把 key 和 value 的数据类型声明为全局变量,而不是局部变量。,这篇文章主要介绍了typing.Dict和Dict的区别及它们在Python中的用途小结,需要的朋友可以参考下
    2023-06-06
  • python采集博客中上传的QQ截图文件

    python采集博客中上传的QQ截图文件

    这篇文章主要介绍了python采集博客中上传的QQ截图文件,因为文件名包含中文会在某些时候乱码,例如这件的文件名QQ截图20120926174732,所以需要采集出来修改掉,需要的朋友可以参考下
    2014-07-07
  • Pandas中如何对DataFrame列名进行重命名

    Pandas中如何对DataFrame列名进行重命名

    在做数据挖掘的时候,想改一个DataFrame的column名称,所以就查了一下,下面这篇文章主要给大家介绍了关于Pandas中如何对DataFrame列名进行重命名的相关资料,需要的朋友可以参考下
    2023-04-04
  • python创建ArcGIS shape文件的实现

    python创建ArcGIS shape文件的实现

    今天小编就为大家分享一篇python创建ArcGIS shape文件的实现,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-12-12
  • python 实现倒计时功能(gui界面)

    python 实现倒计时功能(gui界面)

    这篇文章主要介绍了python 实现倒计时功能(gui界面),帮助大家更好的理解和使用python,感兴趣的朋友可以了解下
    2020-11-11

最新评论