您当前的位置:首页 > 电脑百科 > 程序开发 > 语言 > C/C++/C#

C++调用动态库两种方式和Python调用C++动态库

时间:2023-03-16 14:30:09  来源:今日头条  作者:黑猫编程

创建动态库

动态库是在程序运行时加载的库文件,并不占用程序本身大小。

选择动态库项目:

新建.h和.cpp文件:

# cat.h
#pragma once
extern "C" _declspec(dllexport) int sum(int a, int b);
 
# cat.cpp
#include "pch.h"
#include "cat.h"
extern "C" _declspec(dllexport) int sum(int a, int b) {
return a + b;
}

动态库发布选择Release版本,本样例使用×64位。

C++导入动态库方法一

新建一个空的C++项目,将动态库项目中.lib和.dll文件拷贝到当前项目下:

在C++项目中,添加动态库头文件,可以不复制到当前项目下,添加现有项就可以,这里只需要逻辑上引入,但是在#include时要使用.h文件的路径,绝对路径和相对路径都可以。

#include 
#include "../../CATDLL/CATDLL/cat.h"
using namespace std;
#pragma comment(lib, "CATDLL.lib")
int main() {
cout << sum(1, 2) << endl;
return 0;
}
  • h头文件:包含dll中声明输出的数据结构、类、函数等信息。
  • lib库文件:包含被DLL导出的项目的名称和位置,在调用dll的应用程序可执行文件中,存放的并不是被调用的函数代码,而是DLL中所要调用的项目的内存地址。
  • dll动态库:包含实际的内容,发布时只需要.exe文件和.dll文件,在同一个目录下。

也可以在项目-属性-链接器-输入-附加依赖项中进行配置:

可以省略 :#pragma comment(lib, "CATDLL.lib")

C++导入动态库方法二

#include 
#include 
using namespace std;
typedef int (*PSUM)(int, int);
int main() {
HMODULE hMoudle = LoadLibrary(TEXT("CATDLL.dll"));
PSUM psum = (PSUM)GetProcAddress(hMoudle, "sum");
cout << psum(4, 5) << endl;
FreeLibrary(hMoudle);
return 0;
}

Python/ target=_blank class=infotextkey>Python导入C++动态库

由于C++ dll是64位,Python也要使用64位。

import os
from ctypes import *
os.chdir("D:Cat课件CAT_CODINGC++项目开发MFC进阶和动态库注入辅助PYTEST")
dll = cdll.LoadLibrary("CATDLL.dll")
ret = dll.sum(1, 2)
print(ret)

这样,很多常用的功能都可以用 C++ 制作成动态库,供 C++ 或者Python等其他语言进行调用。



Tags:C++   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
创建动态库动态库是在程序运行时加载的库文件,并不占用程序本身大小。选择动态库项目:新建.h和.cpp文件:# cat.h#pragma onceextern "C" _declspec(dllexport) int sum(int a,...【详细内容】
2023-03-16  Tags: C++  点击:(0)  评论:(0)  加入收藏
六个月以来,国际C++标准化工作组已经召开了两次会议。在第一次会议上,委员会集中于完善C++23的特性,其中包括: 静态运算符[] 静态常量表达式 在 常数表达式 函数 基于安全范围 ...【详细内容】
2023-02-21  Tags: C++  点击:(250)  评论:(0)  加入收藏
当Windows操作系统启动一个程序时,它调用的就是该程序的WinMain函数( 实际是由插入到可执行文件中的启动代码调用的)。 WinMain是Windows程序的入口点函数,与DOS程序的入口点函...【详细内容】
2023-02-19  Tags: C++  点击:(26)  评论:(0)  加入收藏
1.1 nullptr&emsp;&emsp;nullptr 出现的目的时为了替代 NULL。在某种意义上说,传统 C++ 会把NULL、0视为同一种东西,这取决于编译器如何定义 NULL,有些编译器会将 NULL 定义为(...【详细内容】
2023-02-17  Tags: C++  点击:(26)  评论:(0)  加入收藏
最初开始禁用 C++ STL,更多的是早期项目编码实践中留下的惯例,被后来的程序员继承下来。老项目中这种选择尤其地多。不过如果有人将其上升到公司行为在不同项目中全面禁用 STL...【详细内容】
2023-01-15  Tags: C++  点击:(44)  评论:(0)  加入收藏
概念 类模板 std::function 是通用多态函数包装器。 std::function 的实例能存储、复制及调用任何可复制构造 (CopyConstructible) 的可调用 (Callable) 目标&mdash;&mdash;...【详细内容】
2023-01-12  Tags: C++  点击:(41)  评论:(0)  加入收藏
C 是用于开发系统软件和任何微处理器软件的经典语言。 Linux,大部分Windows和MacOS都是写在上面的。 如果你使用任何现代可穿戴小工具或电子设备,在大多数情况下它们也会在 C...【详细内容】
2023-01-07  Tags: C++  点击:(46)  评论:(0)  加入收藏
导读:使用 C 扩展为 Python 提供特定功能。本文字数:7993,阅读时长大约: 9分钟 使用 C 扩展为 Python 提供特定功能。 在前一篇文章中,我介绍了 opensource.com。在大多数系统上,C...【详细内容】
2023-01-03  Tags: C++  点击:(50)  评论:(0)  加入收藏
CLion是一款专为开发C及C++所设计的跨平台IDE。它是以intellij为基础设计的,包含了许多智能功能来提高开发人员的生产力。这种强大的IDE帮助开发人员在Linux、OS X和Windows...【详细内容】
2022-12-27  Tags: C++  点击:(83)  评论:(0)  加入收藏
我们可以通过 时间度量 - Wall time vs. CPU time 来知道Wall time和CPU time的区别是什么,简单来讲,Wall Time就是类似我们的时钟一样,他没有很精确的表示此时CPU花了多少时...【详细内容】
2022-12-23  Tags: C++  点击:(94)  评论:(0)  加入收藏
▌简易百科推荐
创建动态库动态库是在程序运行时加载的库文件,并不占用程序本身大小。选择动态库项目:新建.h和.cpp文件:# cat.h#pragma onceextern "C" _declspec(dllexport) int sum(int a,...【详细内容】
2023-03-16  黑猫编程  今日头条  Tags:C++   点击:(0)  评论:(0)  加入收藏
昨天被骂惨了!因为我写了一个C#父窗体控制子窗体的方法,我把modifiers属性改成了public。本来只是说一下有这么个属性,没想到引起了这顿喷哈哈,虚心接受,感谢朋友们的支持。我错...【详细内容】
2023-03-09  逍遥总遥  今日头条  Tags:C#   点击:(10)  评论:(0)  加入收藏
去年我们官宣了 Visual Studio Code 可以直接导入 ST 项目,今天再次宣布:它的好兄弟 Visual Studio 2022 17.6 也支持此功能,详细请看下文。在 ARM 微控制器领域,有许多芯片供应...【详细内容】
2023-03-09  漫漫开发路  今日头条  Tags:Visual Studio   点击:(15)  评论:(0)  加入收藏
六个月以来,国际C++标准化工作组已经召开了两次会议。在第一次会议上,委员会集中于完善C++23的特性,其中包括: 静态运算符[] 静态常量表达式 在 常数表达式 函数 基于安全范围 ...【详细内容】
2023-02-21  xTech  今日头条  Tags:C++   点击:(250)  评论:(0)  加入收藏
当Windows操作系统启动一个程序时,它调用的就是该程序的WinMain函数( 实际是由插入到可执行文件中的启动代码调用的)。 WinMain是Windows程序的入口点函数,与DOS程序的入口点函...【详细内容】
2023-02-19  黑猫编程  51CTO  Tags:C++   点击:(26)  评论:(0)  加入收藏
1.1 nullptr&emsp;&emsp;nullptr 出现的目的时为了替代 NULL。在某种意义上说,传统 C++ 会把NULL、0视为同一种东西,这取决于编译器如何定义 NULL,有些编译器会将 NULL 定义为(...【详细内容】
2023-02-17  Qt技术开发老jie  今日头条  Tags:C++   点击:(26)  评论:(0)  加入收藏
对于广大C语言开发者来说,缺乏类似C++ STL和Boost的库会让开发受制于基础库的匮乏,也因此导致了开发效率的骤降。这也使得例如libevent这类事件库(基础组件库)一时间大红大紫。...【详细内容】
2023-01-16  码哥比特  今日头条  Tags:C语言   点击:(44)  评论:(0)  加入收藏
最初开始禁用 C++ STL,更多的是早期项目编码实践中留下的惯例,被后来的程序员继承下来。老项目中这种选择尤其地多。不过如果有人将其上升到公司行为在不同项目中全面禁用 STL...【详细内容】
2023-01-15  那就随梦而飞     Tags:C++   点击:(44)  评论:(0)  加入收藏
概念 类模板 std::function 是通用多态函数包装器。 std::function 的实例能存储、复制及调用任何可复制构造 (CopyConstructible) 的可调用 (Callable) 目标&mdash;&mdash;...【详细内容】
2023-01-12  骇客遇见AI  今日头条  Tags:C++   点击:(41)  评论:(0)  加入收藏
C 是用于开发系统软件和任何微处理器软件的经典语言。 Linux,大部分Windows和MacOS都是写在上面的。 如果你使用任何现代可穿戴小工具或电子设备,在大多数情况下它们也会在 C...【详细内容】
2023-01-07  启辰8  今日头条  Tags:C++   点击:(46)  评论:(0)  加入收藏
站内最新
站内热门
站内头条