C++生成动态连接库

news2024/9/24 13:16:18

文章目录

  • 一、静态连接与动态连接
  • 二、 动态链接库(DLL)的创建
  • 三、dll库的使用
  • 四、 动态链接链接库工作原理
  • 五、extern "C"

一、静态连接与动态连接

 静态库和动态库区别是库的加载时间不同。静态库:在链接阶段库将会与.o目标文件一起打包生成可执行文件,成为可执行文件的一部分,后续此库就可以消失了。也就是说在编译的最后一步(链接阶段),如果程序需要使用静态库,在这一步都会一起打包到可执行文件中。
优点:

  1. 使可执行文件依赖项少,已经被打包到可执行文件中了
  2. 编译阶段完成链接,执行期间代码装载速度快

缺点:

  1. 使可执行文件变大
  2. 若作为其他库的依赖库,将会造成多余的副本,因为必须与目标文件打包
  3. 升级不方便,升级必须重新编译

动态库:在编译阶段都不会有任何动作,只有在程序运行时才被加载,也就是动态库的链接是发生在程序运行时期的,它和可执行文件是分开的,只是可执行文件在运行的某个时期调用了它。
优点:

  1. 动态库可以实现进程之间资源共享,有一份就行。

  2. 升级程序简单,不需要重新编译。

缺点:

  1. 运行期间在加载,将会减慢代码执行速度。

  2. 增加程序的依赖项,必须跟着可执行文件一起。

二、 动态链接库(DLL)的创建

  1. VS2019新建动态连接库项目
    创建项目
    新项目
    可以看到新建的项目中自带framework.h, pch.h, dllmain.cpp, pch.cpp四个文件,这是需要新建自己的.h和.cpp文件。
  2. 分别创建用于声明和定义函数的头文件dlltest.h和源文件dlltest.cpp在这里插入图片描述
    在这里插入图片描述
     然后点击生成,编译器报错“……不是有效的win32程序“。
    在这里插入图片描述
    然后打开debug或者release文件夹,可以看到有.lib 和.dll文件。

三、dll库的使用

加载动态库有两种方式,分为隐式加载和显示加载:

隐式加载:所需文件:接口.h头文件,dll文件,lib文件。.h和.lib加载方式与静态加载完全一致。但.dll文件必须放在环境变量指定的目下。当然通常是与目标.exe文件放在一起。

显式加载:所需文件:dll文件。利用LoadLibrary()函数进行加载。

下面介绍一下常用的隐式加载的方法:
(1) 需要将创建的.dll文件以及.lib文件还有定义的.h头文件,拷贝至我们需要测试的新项目的目录下。
在这里插入图片描述

(2)将拷贝的头文件添加到空白项目中.
在这里插入图片描述

(3)在属性—链接器—输入—附加依赖项中添加我们拷贝过来的.lib文件。
在这里插入图片描述

(4)创建一个.cpp源文件开始进行动态库的调用,包含头文件,并且删掉头文件中的#include “pch.h”,随后直接可以调用封装的函数。
在这里插入图片描述

四、 动态链接链接库工作原理

  1. __declspec是Microsoft VC中专用的关键字,它配合着一些属性可以对标准C/C++进行扩充。__declspec关键字出现在声明的前面。
  2. __declspec(dllexport)声明导出函数、类、对象等供外部调用,省略.def文件(.def文件(模块定义文件)是包含一个或多个描述各种DLL属性的Module语句的文本文件,如果不提供__declspec(dllexport)导出DLL函数,则DLL需要提供.def文件)。
  3. __declspec(dllimport)用于Windows中,从别的动态库中声明导入函数、类、对象等供本动态库或exe文件使用。当使用DLL中的函数时,不需要显示地导入函数,编译器也可自动完成导入。__declspec(dllimport)可以确定函数是否存在于DLL中,这使得编译器可以生成跳过间接寻址级别的代码,而这些代码通常会出现在跨DLL边界的函数调用中。

五、extern “C”

void Swap(int a, int b);

C编译后,函数名变为 _Swap
C++编译后,因为有重载语法的原因,函数名变为 _Swap_int_int

同一个函数经过C和C++编译后,函数名不同。extern “C” 让C++以C的命名风格编译代码。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1539622.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【redis】服务器架构演进

架构演进 单机架构应用数据分离架构应⽤服务集群架构读写分离 / 主从分离架构冷热分离架构垂直分库微服务架构 单机架构 所有的应用服务、业务所需的数据、业务处理等都在一台服务器上。 在初期,用户访问量很少,对服务器的的性能和安全没有很高的要求&am…

docker入门(一)—— docker概述

docker 概述 docker 官网:http://www.docker.com 官网文档: https://docs.docker.com/get-docker/ Docker Hub官网:https://hub.docker.com (仓库) 什么是 docker docker 是一个开源的容器化平台,可以…

盛最多水的容器——算法思路

题目链接:11. 盛最多水的容器 - 力扣(LeetCode) 题解: while中的主要步骤解释: 首先判断索引 i 处的高度是否小于索引 j 处的高度, 如果小于则计算 ( j - i ) * height [ i ];(先取…

有哪些强大好用的AI表格数据处理工具或者 AI Excel工具?

在繁忙的工作和生活中,处理大量的表格数据往往令人感到头疼。面对一列列数字、一行行文字,我们需要花费大量的时间和精力去整理、核对。然而,随着科技的飞速发展,人工智能(AI)技术正逐渐改变这一现状。 如…

C# 对App.config、Web.config的appSettings节点数据进行加密

appSettings加密原因,就是因为容易暴露服务器账号和密码,而且客户也不允许 使用ASP.NET提供的命令工具aspnet_regiis来创建加密命令;aspnet_regiis是提供了直接对配置文件加密的功能的;并且使用aspnet_regiis加密的配置节点在读取…

uniapp套壳打包成apk

不管是vue项目还是uniapp项目,只要能打包成 index.html都可以通过uniapp打包成apk 1.首先把这个项目发布到线上 拿百度举例: 发布到百度服务器用 www.baidu.com能访问到 2.然后到uniapp上发布项目用默认的 vue2,如果你的项目是vue3也用vue2 3.废话我觉得说太多了,直接…

被群辉升级折腾得够呛

群辉升级后,因为版权问题,VideoStation 不支持播放 EAC3 格式的视频了,导致我大量视频都没法用 AppleTV 播放。 网上早期流传了各种方案,比如回退 VideoStation 版本等,都试过了,没啥用。 2024 年 3 月&a…

基于springboot+vue的影院订票系统

博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战,欢迎高校老师\讲师\同行交流合作 ​主要内容:毕业设计(Javaweb项目|小程序|Pyt…

不要再封装各种 Util 工具类了,神级框架值Hutool

Hutool 谐音 “糊涂”,寓意追求 “万事都作糊涂观,无所谓失,无所谓得” 的境界。 Hutool 是一个 Java 工具包,也只是一个工具包,它帮助我们简化每一行代码,减少每一个方法,让 Java 语言也可以 …

深入理解Python异常处理机制:助力你的自动化测试脚本

前言 前些天,公司准备使用开源BI工具superset,但部署成功后,连接阿里数仓获取表时,一直报错,苦于日志不详细,从日志中并没有看出哪里的问题,然后就拉源码进行调试,终于找到抛出异常的…

2024年计算机三级|数据库习题整理(自用③)

所有题目均来自【三级数据库技术基础题库】,此博客仅包含部分设计题与应用题,用于自主的回顾学习,仅供参考。 ER图绘制 代码补全 方案选择 (1)在不改变SQL语句和不对表做分区的情况下,可以为学生进出校的申…

自动驾驶感知新范式——BEV感知经典论文总结和对比(一)

自动驾驶感知新范式——BEV感知经典论文总结和对比(一) 博主之前的博客大多围绕自动驾驶视觉感知中的视觉深度估计(depth estimation)展开,包括单目针孔、单目鱼眼、环视针孔、环视鱼眼等,目标是只依赖于视…

【Python爬虫】将某网页中表格里的十六进制颜色值转换成十进制,再生成新表格

【需求】 在 https://www.cnblogs.com/heyang78/p/5712076.html 上有360种颜色及代码,但很遗憾没有十进制的RGB值,使用时需要自己转换一下,此过程依赖网络或计算器,颇为不便。因此,拟设计一爬虫将原有表格内容取出&am…

深度学习入门指南:从理论到实践

深度学习如何入门 深度学习是机器学习的一个分支,它通过模拟人脑神经网络的结构和功能来实现对数据的学习和理解。近年来,深度学习在图像识别、自然语言处理、语音识别等领域取得了显著的成果,越来越受到人们的关注。如果你想入门深度学习&a…

Ambari——编译——解决PowerShell中报错问题

您的支持是我继续创作与分享的动力源泉!!! 您的支持是我继续创作与分享的动力源泉!!! 您的支持是我继续创作与分享的动力源泉!!! 错误日志 因为在此系统上禁止运脚本。有关详细信息,请参阅 https:/go,microsoft,com/fwlink/?LinkID135170 中的 about_Execution…

Cesium安装部署运行

目录 1.简介 2.Cesium项目下载 3.Cesium项目运行 4.cesium运行 1.简介 Cesium是国外一个基于JavaScript编写的使用WebGL的地图引擎。Cesium支持3D,2D,2.5D形式的地图展示,可以自行绘制图形,高亮区域,并提供良好的触摸支持,且支…

安卓手机系统跳过app启动广告软件

跳过广告关于此应用声明: 应用利用了安卓系统的辅助功能API,可以读取您手机屏幕上显示的所有内容,并且可以以您的名义进行屏幕点击等操作。* 轻量无广告,不联网,也不需要任何权限;* 请务必在系统设置中开启…

es bulk批量操作简单实例

(1)定义 bulk允许在单个步骤中进行多次create、index、update或delete请求。 bulk与其他的请求体格式稍有不同,如下所示: { action: { metadata }}\n { request body }\n { action: { metadata }}\n { request body …

C++多态机制详解(多态实现原理,单继承和多继承时虚函数表,菱形继承时的虚函数表原理)

文章目录 多态的定义多态的实现1.多态实现的两个必要条件2.什么是虚函数3.重写的条件4.多态实现代码5.重写的两个例外 C11引入的final和override关键字重载,重写(覆盖),隐藏(重定义)抽象类接口继承和实现继…

关于JAVA8的Lambda表达式

1. 水在前面 这个礼拜忽然心血来潮把Lambda表达式学习了一遍,发现这玩意跟原来想象的好像不是一个东西,写个学习心得供以后复习用。还是那句话,这篇水文不能让你完全掌握,只是用来给我自己温习用的,或者也可以作为小伙…