C++生成动态连接库

文章目录

  • 一、静态连接与动态连接
  • 二、 动态链接库(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.mzph.cn/news/773719.shtml

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

相关文章

YOLO中的预训练模型是否需要

这张图片显示的是使用YOLOv5(一种流行的物体检测算法)进行训练时的一段命令行指令以及对应的注释,这些注释是中文的。这里列出的是两个不同情况下的命令行用法。 上面的命令: python train.py --data custom.yaml --weights yolo…

C++中的凸包:convexHull使用手册【c++重要方法】

最近工作中,用到了凸包,查了一些资料,差不多搞明白了,在这里做一个总结,希望可以帮助到你! 什么时候需要它? 如果你想要把一群散落的点,包裹起来。而且希望这个包裹尽可能地紧凑&a…

MQTT.fx和MQTTX 链接ONENET物联网提示账户或者密码错误

参考MQTT.fx和MQTTX 链接ONENET物联网开发平台避坑细节干货。_mqttx和mqttfx-CSDN博客 在输入password和username后还是提示错误,是因为在使用token的时候,key填写错误,将设备的密钥填入key中

How to convert .py to .ipynb in Ubuntu 22.04

How to convert .py to .ipynb in Ubuntu 22.04 jupyter nbconvertp2j 最近看到大家在用jupyter notebook,我也试了一下,感觉还不错,不过,也遇到了一些问题,比方说,我有堆的.py文件,如果要一个一…

赛氪网亮相中国人工智能产业发展联盟会议,共筑赛事生态新篇章

2024年3月14日至15日,备受瞩目的中国人工智能产业发展联盟(AIIA)第十一次全体会议在海南海口盛大召开。作为人工智能领域的重要交流与合作平台,此次会议吸引了300余位联盟成员单位代表齐聚一堂,共襄盛举。在这场人工智…

NIO与AIO

NIO与AIO NIO模型 在 LInux 环境中,java.nio.channels.Selector 的子类叫做 sun.nio.ch.EPollSelectorImpl ,其底 层是基于 Epoll 模型去实现的 IO 多路复用器。 对于 Epoll 模型 我们需要了解到它底层的三个函数 在 JDK 实现的底层中,EPol…

某对象存储元数据集群改造流水账

软件产品:某厂商提供的不便具名的对象存储产品,核心底层技术源自HDFS和Amazon S3,元数据集群采用了基于MongoDB的NOSQL数据库产品和MySQL数据库产品相结合。 该产品的元数据逻辑示意图如下: 业务集群现状:当前第3期建…

勾八头歌之分类回归聚类

一、机器学习概述 第1关机器学习概述 B AD B BC 第2关常见分类算法 #编码方式encodingutf8from sklearn.neighbors import KNeighborsClassifierdef knn(train_data,train_label,test_data):input:train_data用来训练的数据train_label用来训练的标签test_data用来测试的数据…

【Monero】Onion Monero Blockchain Explorer | 洋葱门罗币区块链浏览器

github:onion-monero-blockchain-explorer Onion Monero Blockchain Explorer特点: • 没有cookie,没有网络分析跟踪器,没有image, • 开源, • 完全用C编写, • 显示加密的付款 ID, • 显示环…

Django auth模块

【一】命令行创建用户 【1】语法 python manage.py createsuper【2】示例 用户名 默认是是电脑名称 邮箱 可以填也可以不填 密码 terminal中:输入密码不显示出来manage.py中:明文输入输入密码太简单会提示 Username (leave blank to use administra…

20231911 2022-2023-2 《网络攻防实践》实验三

1.实验内容 1、实践tcpdump 使用tcpdump开源软件对在本机上访问www.tianya.cn网站过程进行嗅探,回答问题:你在访问www.tianya.cn网站首页时,浏览器将访问多少个Web服务器?他们的IP地址都是什么? 2、实践Wireshark 使…

Cesium for UE-03-添加数据集(倾斜摄影)

继续上一章节,在创建了项目和关卡的基础上添加倾斜摄影 重新打开上次的项目和关卡 如果你已经关掉了上次的项目和关卡,可以重新打开ue,然后选择 选择 文件-打开关卡,在弹出的窗口中,选择 上次的关卡,并点击…

从汇编以及栈帧层面理解内联函数的原理

宏太复杂,所以弄出内联,内联适合小函数,把函数连到程序里面,这样就直接用,不需要调用,但是它占用空间。 C推荐 const和enum替代宏常量 inline去替代宏函数 宏缺点: 1、不能调试 2、没有类型安…

多层感知机-----自我神经MLP入门笔记

多层感知机(Multilayer Perceptron, MLP)是一种常见的人工神经网络(Artificial Neural Network, ANN)模型,它由多个人工神经元组成的多层结构。每个神经元都与前一层的所有神经元连接,并且每条连接都有一个…

HarmonyOS(鸿蒙开发)入门篇

如果需要学习鸿蒙开发可以查看以下学习资源链接 OpenAtom OpenHarmony Develop applications - HUAWEI HarmonyOS APP 转载请注明出处HarmonyOS(鸿蒙开发)入门篇-CSDN博客,谢谢!

如何使用PHP和RabbitMQ实现延迟队列(方式一)?

前言 今天我们来做个小试验,用PHP和RabbitMQ实现消息队列的延迟功能。 前期准备,需要安装好docker、docker-compose的运行环境。 需要安装RabbitMQ的可以看下面这篇文章。 如何使用PHP和RabbitMQ实现消息队列?-CSDN博客 一、安装RabbitM…

js逆向之实例某宝热卖(MD5)爬虫

目录 正常写 反爬 逆向分析 关键字搜索 打断点&分析代码 得出 sign 的由来 确定加密方式 写加密函数了 补全代码 免责声明:本文仅供技术交流学习,请勿用于其它违法行为. 正常写 还是老规矩,正常写代码,该带的都带上,我这种方法发现数据格式不完整. 应该后面也是大…

R语言学习——Rstudio软件

R语言免费但有点难上手,是数据挖掘的入门级别语言,拥有顶级的可视化功能。 优点: 1统计分析(可以实现各种分析方法)和计算(有很多函数) 2强大的绘图功能 3扩展包多,适合领域多 …

C语言数据结构基础————二叉树学习笔记(四)简单的OJ题目练习

1.单值二叉树 965. 单值二叉树 - 力扣(LeetCode) 建立一个新的函数,用函数传参的方法来记录val的值 如上一篇最后的对称二叉树的习题,建立新的函数来传参 多采用使用反对值的方法,因为如果是相等return true的话&am…