C++创建动态库的方法

C++生成动态连接库 静态库和动态库区别是库的加载时间不同。:在链接阶段库将会与.o目标文件一起打包生成可执行文件,成为可执行文件的一部分,后续此库就可以消失了。也就是说在编译的最后一步(链接阶段),如果程序需要使用静态库,在这一步都会一起打包到可执行文件中。:在编译阶段都不会有任何动作,只有在程序运行时才被加载,也就是动态库的链接是发生在程序运行时期的,它和可执行文件是分开的,只是可执行文件在运行的某个时期调用了它。优点:动态库可以实现进程之间资源共享,有一份就行。升级程序简单,不需要重新编译。 阅读详情

1.简要介绍

a.在函数名和返回值之间存在调用约定,调用约定用来协商传参的方式,内容如图:在这里插入图片描述
b.从微软官方文档可以看到,导出函数务必遵守__sytdcall约定:在这里插入图片描述
c.dll导出方式有以下两种:在这里插入图片描述

2.创建DLL工程

a.打开vs工程新建“具有导出向的动态链接库”,默认工程微软给了示例,包含导出类、函数和变量,保留自己用到的,此处导出一个Add函数出来。

头文件中:

#ifdef DLLEXPORT_EXPORTS
#define DLLEXPORT_API __declspec(dllexport)
#else
#define DLLEXPORT_API __declspec(dllimport)
#endif
DLLEXPORT_API int Add(int a, int b);

cpp文件中:

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

编译后则会在Debug目录生成dll和lib文件。
再新建一个控制台应用工程,只需包含上述DLL的头文件和lib文件目录即可在工程里调用Add函数。

如果C++导出的dll工程给C语言使用,那么在导出的时候需添加宏定义,因为两种语言对函数的解释方法不同。

#ifdef __cplusplus
extern "C"
{
#endif
DLLEXPORT_API int Add(int a, int b)
#ifdef _cplusplus
}
#endif

b.def的方式导出函数,优点是导出的函数名比较清楚,不需要在函数的声明和定义前增加DLLEXPORT_API。
操作方法:
①选中项目右击添加新建项,代码->模块定义文件.def,在源文件中会增加.def文件,在def文件中修改如下,EXPORTS后面增加导出的函数名。
def文件

LIBRARY DLLExport
EXPORTS
 Add

头文件

int Add(int a, int b);

cpp文件

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

此时再次重新编译后,运行控制台工程同样能够执行。
备注:如果想取消使用def文件,右击项目打开属性,在链接器->输入->模块定义文件中,删除def文件即可。

使用C++开发动态链接库的过程总结 该动态库是为第3方系统提供数据导入导出功能(就是实现几个函数)。项目要求用C++进行封装,由于本人没有C++方面的开发经验,只能临时学习和琢磨了。下面简要说明一下项目的开发过程。 一、开发环境选择 我是windows环境下的开发者,选择的环境是Visual Studio 2010,环境安装就不再说了(这个应该难不倒开发人员的啊)。 二、创建项目 在vs窗口文件菜单... 阅读详情

相关推荐

C++ 动态链接库DLL创建及使用

完成以上步骤后,可将Dll项目中的 xxx.dll文件生成到应用程序中,可调用xxx.dll、xxx.lib和头文件。① 生成lib和dll文件到本项目目录中(生成到——> \x64\Debug 中)点击右侧项目,右键——添加 ——新建项目(ctrl+shift+a)② 重新生成,出现生成成功字样,生成到本项目的Debug中。,如果不在一个解决方案的文件夹中,请确定指定文件夹。填入项目名称,勾选:将解决方案和项目放在同一目录中。(不修改,默认保存到解决方案目录中)右键解决方案——添加——新建项目。

JYliangliang的博客 6635

C++(GCC)生成和使用动态库

使用动态库的好处有以下几点: 1. 节省内存空间:动态库在程序运行时才会被加载,不会像静态库那样在编译时就被全部链接进可执行文件中,因此可以节省内存空间。 2. 便于更新:当动态库更新时,只需要替换动态库文件即可,不需要重新编译整个程序。 3. 提高程序运行效率:由于动态库可以被多个程序共享,因此可以减少内存中的重复代码,提高程序运行效率。 4. 方便程序的开发和维护:动态库可以被多个程序共享,因此可以减少代码冗余,提高代码复用率,方便程序的开发和维护。 5. 支持动态加载。

mahuifa的博客 4907

linux平台中c代码调用c++动态库

首先,我们先需要添加一个外壳,外壳的功能是:将c++的类的方法进行包装,形成类似C语言的库函数 我们需要建立一个.cpp文件和一个头文件,例如:HBShell.cpp:#include <stdio.h> #include <stdlib.h> #include <string.h> #include "HrvBike.h" #include "HBShell.h" hrvBikeInterface

liufaqst的博客 961

C/C++程序编译与链接(四) 创建动态库

其实站在开发者的角度,认为API与ABI是应该等价的,代码里的接口匹配,难道编译后,二进制文件中的接口对应的符号还不匹配吗?是的,对C++来说是要需要关注这些问题。

mo4776的博客 2147

Android11.0Frameworks中添加jni并调用自己的动态库

Android11.0Frameworks中添加jni并调用自己的动态库

yjz_0314的博客 834

C++动态库创建与调用教程:从基础到实战

动态库是一种在程序运行时才被加载的库,它包含可以被多个程序同时访问的代码和数据。与之相对的是静态库,静态库在编译时被直接包含在最终可执行文件中。动态加载,也称为运行时加载,是一种在程序运行时将程序所需的库文件(动态链接库,DLL)加载到进程地址空间中的技术。它与静态加载相对,后者是在编译时期就把库链接到可执行文件中。动态加载的优势在于可以实现插件架构、按需加载资源和模块化管理,尤其在软件更新频繁或需要热插拔模块的场景中十分有用。

weixin_42160645的博客 1072

C++ 创建动态库及两种方法调用动态库

摘要:本文介绍了在VS2019环境下创建动态库的步骤。首先新建空项目并将配置类型改为DLL,然后编写头文件(MyLibrary.h)定义导出/导入宏(MYLIBRARY_API)和函数原型(add和reverse_string)。接着实现.cpp文件,包含加法函数和字符串反转函数的具体实现。通过extern "C"确保函数名不被修饰,最终完成动态库的创建。该库提供基础数学运算和字符串处理功能。

doubleintfloat的博客 675

【参数不确定】敏感性分析(sensitivity analysis)

【运筹学】灵敏性分析

羊肉蛋花汤的博客 14万+

C++静态库与动态库、创建及调用方法

1 什么是库 库是写好的现有的,成熟的,可以复用的代码。现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始,因此库的存在意义非同寻常。本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。库有两种:静态库(.a、.lib)和动态库(.so、.dll)。所谓静态、动态是指链接。回顾一下,将一个程序编译成可执行程序的步骤: 图1:编译过程 1.1

fabulousli的博客 7926

基于OpenCV的围棋终局识别与胜负判定系统实现

计算机视觉是人工智能领域的关键技术,它使计算机能够从数字图像或视频中获取、处理和分析信息。其核心原理在于通过图像处理算法提取特征,并基于这些特征进行识别、分类和测量。在工程实践中,计算机视觉技术为自动化、智能化应用提供了强大支持,广泛应用于工业检测、自动驾驶、医疗影像分析等领域。本文聚焦于一个具体的应用场景:利用OpenCV库实现围棋终局识别。通过图像预处理、棋盘检测与透视校正、交叉点定位等步骤,结合围棋规则逻辑,构建了一套从棋盘图像自动判定胜负的解决方案。该方案涉及自适应二值化、霍夫变换、连通域分析等关键

weixin_29100927的博客 279

Python气象雷达数据处理实战:用PyCINRAD从基数据到PPI图的完整流程

本文详细介绍了使用PyCINRAD库处理气象雷达基数据并生成PPI图的完整流程,涵盖环境配置、数据读取、反射率与速度数据提取、可视化优化等关键步骤。通过实战案例演示如何从原始雷达数据到专业级PPI图像生成,为气象研究和业务应用提供高效解决方案。

yog99的博客 758

linux系统下静态库及动态库的生成及使用方法

1.创建myAPI.h文件 内容如下: int ADD(int a,int b); int MINUS(int a,int b); 2.创建myAPI.cpp文件 #include"myAPI.h" int ADD(int a,int b){ return a + b; } int MINUS(int a,int b){ return a - b;} 3.创建main.cpp文件 ...

songlipeng的专栏 375

AI赋能软件测试:从冒烟测试到全流程智能化的效率革命

软件测试是确保软件质量的关键环节,其核心原理是通过预设用例验证系统功能是否符合预期。传统测试方法依赖人工编写和维护脚本,面临维护成本高、适应性差等挑战。随着人工智能技术的发展,特别是自然语言处理和计算机视觉的成熟,AI为测试领域带来了新的技术价值。通过让AI理解应用界面和业务逻辑,可以实现测试用例的智能生成、自主执行和结果分析,显著提升测试效率和覆盖率。在实际应用场景中,AI驱动的冒烟测试能够动态适应UI变化,自动分析失败日志,将测试人员从重复劳动中解放出来,专注于更复杂的质量策略设计。本文基于AI在冒烟测

weixin_28841265的博客 306

文字转语音——sherpa-onnx语音识别离线部署C++实现

C++项目中接入Sherpa-onnx实现文字转语音功能Windows、VS2022选择动态库是因为能够避免一些配置上的bug。库文件地址:https://huggingface.co/csukuangfj/sherpa-onnx-libs/tree/main 里边有各个平台的库文件,选择最新版本的window 64bit shared下载。 git地址:https://github.com/makdi76/sherpa-onnxsherpa-onnx教程地址:sherpa-onnx — sherpa 1.

huanrx的博客 5344

RK3588多路MIPI摄像头采集与WiFi低延迟传输实战指南

本文详细介绍了基于RK3588平台实现多路MIPI摄像头同步采集并通过WiFi进行低延迟传输的完整实战方案。文章深入剖析了从V4L2驱动配置、多线程采集、环形缓冲区设计到UDP网络传输优化的核心技术,旨在帮助开发者在工业检测、智能安防等场景下构建高并发、高实时性的视频流系统,实现端到端延迟控制在100毫秒以内的目标。

tensor9flow的博客 786

RK平台以太网设置中添加代理设置

以太网中配置Configuration的时候可以IpConfiguration的初始化函数来设置代理类型和代理参数。通过添加一个KEY_ETH_PROXY的选项来设置代理的配置,然后再设置以太网静态或者动态的类型时候下发给系统进行设置。

Android系统开发笔记 656

VS C++ 工程中隐藏Cpp文件

按照项目的要求,在把代码工程给甲方爸爸之前,需要隐藏一些关键技术,把cpp给隐藏。 方法一:链接Obj文件 学编程的都知道,生成工程前需要先编译再链接,所以首先我们编译一遍工程,然后在项目工程的debug目录找到需要链接的obj文件,这里我们用以下文件作为实列 然后我们复制一份工程作为给甲方的代码,在复制的工程下把上面相应的cpp从工程中移除,选中MenDB.cpp文件,右键选中移除,若是能删除选删除,否则还要在工程目录中找到并删除。 删除上述文件后,在项目->属性->链接器->输入-

qq_42136233的博客 1199

基于巴法云物联网云平台构建可视化控制网页(以控制LED为例)

本文基于巴法云物联网云平台构建可视化控制网页,实现了对LED的控制。

kevin1499的博客 4518

C++动态库调用

visual studio 创建动态库项目DemoDll添加头文件mydll.h 添加cpp文件mydll.cpp 右键项目DemoDll,生成,即可生成mydll.lib mydll.dll 等文件创建引用动态库项目 控制台项目DemoInvokeDll创建cpp文件 引入动态库右键DemoInvokeDll项目-->配置属性-->C/C++-->常规-->附加包含目录-->新行-->选择动态库目录。添加依赖项右键DemoInvokeDll项目-->配置属性-->链接器-->输入-->附加

larance的挨踢生活 741

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

C与CPP文件的区别

C与CPP文件的区别 在编译源文件时,C编译器和C++编译器都会对符号(函数或变量)名作某些修正,但两者采用的修正方法不同,所以两者生成的目标文件不能互相链接。在C++中使用extern "C"可以让C++符号获得C链接特性。由于C++编译器会自动定义__cplusplus宏,所以在C语言头文件中采用这种结构可以保证无论使用何种编译器,生成的目标文件都具有C链接特性,能够与标

kendyhj9999的专栏 746

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

RedPanda-CPP项目模板使用技巧:快速创建专业C/C++工程

RedPanda-CPP是一款基于Qt开发的轻量级C/C++集成开发环境(IDE),它提供了丰富的项目模板功能,帮助开发者快速搭建专业的C/C++工程。本文将详细介绍如何充分利用RedPanda-CPP的项目模板,提升开发效率,让你轻松创建规范的C/C++项目。 ## 为什么使用项目模板? 项目模板是RedPanda-CPP的核心功能之一,它能够: - 提供标准化的项目结构,确保代码组织一致性

gitblog_01423的博客 864

golang使用Cgo调用C++动态库

因项目需要,最近在研究如何Golang如何调用C++动态库,因Cgo只能调用纯C的动态库/静态库,且网络上的资料比较分散,导致编写demo过程中遇到了许多坑,浪费了一些时间,借此记录。 1.封装纯C接口 可能遇到的问题: gcc api.cpp hello.cpp -fPIC -shared -o libTest.so 2.golang ...

Eric_zhang929的博客 6073

Linux环境下,java调用C/C++动态库

Linux环境下,java调用C/C++动态库

challenglistic的博客 2838

用newlisp通过C++动态库访问MongoDB

我想让我的newlisp程序访问MongoDB. 现在已经有MongoDB C driver,但是我没有时间去学习,只想尽快的完成工作。下面是我的方法,用C++创建一个动态库,这个动态库引用了MongoDB C++ driver. 但是会用extern "C" 导出C函数。一件事情必须知道,MongoDB C++ driver必须用-fPIC选项编译。首先,创建db.h文件extern "C" v

Dean Chen的专栏 4490
上一篇: C++动态库和静态库的使用方法和区别
下一篇: 函数模板学习记录
照书抄代码
博客等级 码龄8年 32粉丝 50原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值