C/C++:Windows动态链接库

动态链接库(Dynamic Link Library,简称DLL)是在运行时加载的库,它们的代码和数据在内存中与目标程序共享;这意味着多个程序可以共享相同的库实例,并且库的代码可以在不重新编译目标程序的情况下更新。

工作原理
开发人员创建一个或多个动态链接库,其中包含他们想要重用的代码。
在编译目标程序时,链接器会在可执行文件中包含对动态链接库的引用,但不会将库的代码复制到可执行文件中。
在运行时,操作系统的动态链接器(如Windows中的DLL或Linux中的.so文件)会将库加载到内存中,并将其与目标程序共享。
动态链接库优点:
多个程序可以共享相同的库实例,因此不会重复占用内存空间;库的代码可以在不重新编译目标程序的情况下更新。
动态链接库缺点:
程序需要在运行时访问正确版本的库,否则可能会导致运行时错误;与静态链接相比,动态链接可能会增加启动时间和内存占用,因为需要在运行时加载和链接库。

在Windows平台上,DLL可以由多种编程语言编写,包括C、C++、C#等。开发人员可以使用工具如Microsoft Visual Studio等来创建、编译和管理DLL。通常,DLL文件具有.dll的文件扩展名。

DLL生成和使用:

生成DLL:

在 Windows 平台上,创建和使用 DLL(Dynamic Link Library)通常涉及以下步骤:

1.编写源代码: 编写你的 DLL 的源代码,包括需要导出的函数、变量以及其他需要在 DLL 中使用的代码,通常需要源代码+头文件(调用DLL中的代码可以根据头文件进行)。

示例:

①tool.h中的代码:声明一个add函数,可以使用add函数计算两个数相加。

#pragma once
#include<stdio.h>
__declspec(dllexport) int add(int nNumberA, int nNumberB);

②tools.c中的代码:add函数的具体实现

#include "tools.h"
​
__declspec(dllexport) int add(int nNumberA, int nNumberB)
{
    return nNumberA+nNumberB;
}

__declspec(dllexport) 关键字来标记需要在 DLL 中导出的函数和数据的声明;这将告诉编译器要将这些函数和数据导出到 DLL 中。

2.在VS中设置生成DLL文件

右击项目-->选择属性,打开项目属性页;

在项目属性页中设置代码生成类型为动态库(.dll),目标文件名根据自喜设置,目标文件扩展名点击应用后VS会自动修改;

3.生成 DLL 文件: 右击项目--->选择生成;

在输出中获取.dll文件生成的路径;

根据路径打开.dll文件所在的文件夹,会发现除了.dll动态库文件外,VS还生成了一个.lib文件;

这个.lib 文件通常是用于动态链接的导入库(Import Library),而不是静态链接库文件;要注意区分。导入库(Import Library)是用于在编译时指示链接器如何链接 DLL 的文件。它包含了对 DLL 中函数和数据的引用,以便在编译时将它们链接到最终的可执行文件中。

DLL文件的使用

打开需要用到生成的DLL文件的项目的所在文件夹;

将上述.h头文件、.dll动态链接库文件、.lib导入库文件复制到该项目的文件夹中;

接着通过添加现有项将头文件.h导入项目头文件中,将.lib导入库文件导入资源文件中;

导入完成后就可以在项目代码中使用动态连接库文件中的函数或变量等代码了;

#include <stdio.h>
​
int main()
{
    printf("%d", add(5, 5));
}
​

最后的执行结果:

DLL文件使用成功。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【C#】WPF加载浏览器

结果展示 下载SDK 前端代码 红色框住的为添加代码 <Window x:Class"WPFwebview.MainWindow"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d"http://…

jenkins自动化持续集成

一、安装Jenkins 1、下载安装jdk-17、jenkins.msi&#xff08;注意如果jenkins安装到最后一步时&#xff0c;无法完成&#xff0c;可能是jdk版本和Jenkins版本不匹配造成&#xff09; 2、Jenkins安装 &#xff08;1&#xff09;双击jenkins.msi&#xff0c;点击next &#x…

网安面经之文件上传漏洞

一、文件上传漏洞 1、文件上传漏洞的原理&#xff1f;危害&#xff1f;修复&#xff1f; 原理&#xff1a;⽂件上传漏洞是发⽣在有上传功能的应⽤中&#xff0c;如果应⽤程序对⽤户上传的⽂件没有控制或者存在缺陷&#xff0c;攻击者可以利⽤应⽤上传功能存在的缺陷&#xff…

数据结构(十四)----排序算法(1)

目录 一.排序的基本概念 二.插入排序 1.直接插入排序 2.折半插入排序 三.希尔排序&#xff08;Shell Sort&#xff09; 四.交换排序 1.冒泡排序 2.快速排序 快速排序算法的效率&#xff1a; 快速排序算法的稳定性&#xff1a; 这一篇博客的重点主要是快速排序&#x…

Transformer 模型

文章目录 前言一、模型结构 前言 Transformer 模型是由谷歌在 2017 年提出并首先应用于机器翻译的神经网络模型结构。机器翻译的目标是从源语言&#xff08;Source Language&#xff09;转换到目标语言&#xff08;Target Language&#xff09;。Transformer 结构完全通过注意力…

基于.NetCore和ABP.VNext的项目实战一:abp cli 搭建项目

学习了阿星Plus的博客项目,自己也试着搭建自己的博客。 ABP和ABP.VNext的主要区别在于核心库的精简、对领域驱动设计(DDD)的关注、以及使用的技术栈。 1、ABP VNext的核心库相比ABP更加精简,它将原有许多组件从核心库中抽离成独立的组件,这使得开发者可以更灵活地选择需要…

HTML常用标签-列表标签

列表标签 有序列表 分条列项展示数据的标签, 其每一项前面的符号带有顺序特征 无序列表 分条列项展示数据的标签, 其每一项前面的符号不带有顺序特征 有序列表标签 ol无序列表标签 ul列表项标签 li代码 <!-- 有序列表 --><ol><li>JAVA</li><li>前…

乡村振兴的农业科技创新:加大农业科技投入,推广农业科技成果,提升农业科技创新水平,推动美丽乡村农业现代化

一、引言 随着全球化和信息化时代的到来&#xff0c;农业作为国民经济的基础&#xff0c;其现代化进程日益受到关注。在乡村振兴战略的大背景下&#xff0c;农业科技创新成为推动乡村经济转型升级、实现农业现代化的关键力量。本文旨在探讨如何通过加大农业科技投入、推广农业…

sd卡修复方法

如何修复损坏或损坏的SanDisk设备 1.使用命令提示符修复损坏的SanDisk SD卡 按“Windows”按钮&#xff0c;键入“command”并按Enter键现在&#xff0c;使用文件资源管理器窗口中的垂直三个菜单选择“此设备”&#xff0c;查看存储卡字母切换到命令提示符窗口并键入“chkdsk”…

PCIe规格1M/4M 1553B总线适配卡

1553B是面向测试仿真应用开发的1553B总线适配卡&#xff0c;支持1M和4M总线速率。该产品提供1 ~ 4个双冗余1553B通道&#xff0c;支持单功能/全功能。产品采用高速SRAM和大容量DDR3缓存&#xff0c;提高了总线消息的响应性能&#xff0c;可实现对多通道全功能应用以更好的支持。…

【SpringSecurity源码】过滤器链加载流程

theme: smartblue highlight: a11y-dark 一、前言及准备 1.1 SpringSecurity过滤器链简单介绍 在Spring Security中&#xff0c;过滤器链&#xff08;Filter Chain&#xff09;是由多个过滤器&#xff08;Filter&#xff09;组成的&#xff0c;这些过滤器按照一定的顺序对进…

Excel 将非分组列的数据移到同一行

例题描述和简单分析 有 Excel 数据如下所示&#xff1a; Account NameJoin DateOther ColumnsPackageAccount 12001/1/19DataMain PackageAccount 12001/1/19DataBolt OnAccount 12001/1/19DataAdd onAccount 22001/1/18DataMain PackageAccount 32001/1/17DataMain PackageA…

基于若依的开源网盘系统

简介 在线网盘系统&#xff0c;使用了DFA算法&#xff0c;实现了文件夹的创建与修改&#xff0c;多级目录&#xff0c;很正常的文件夹一样&#xff0c;支持所有文件上传&#xff0c;并按文件类型分类&#xff0c;支持文件删除&#xff0c;回收站管理&#xff0c;恢复与彻底删除…

零一万物Yi-1.5来了,国产开源大模型排行榜再次刷新

在 OpenAI 发布会的前一天&#xff0c;来自中国的大模型公司零一万物&#xff0c;让开源大模型社区活跃了起来&#xff1a;Yi 大模型家族新成员「Yi-1.5」模型正式开源。 在项目主页可以看到&#xff0c;Yi-1.5 包括一系列预训练和微调模型&#xff0c;分为 6B、9B、34B 三个版…

Netgear无线路由器漏洞复现(CVE-2019-20760)

漏洞概述 漏洞服务&#xff1a; uhttpd 漏洞类型&#xff1a; 远程命令执行 影响范围&#xff1a; 1.0.4.26之前的NETGEAR R9000设备会受到身份验证绕过的影响 解决建议&#xff1a; 更新版本 漏洞复现 操作环境&#xff1a; ubuntu:22.04 qemu-version&#xff1a; 8.1…

从零实现一套低代码(保姆级教程)【运行时】 --- 【29】实现设计态的预览按钮和全屏展示

摘要 目前这个低代码平台的整体&#xff0c;我们已经搭建好了。后续可能就是一些额外功能的补充。现在我们看这个平台会发现一个比较明显的问题&#xff1a; 就是在运行时&#xff0c;能展示组件的地方只有中间的画布区。因为在设计态的时候&#xff0c;我们就已经缩小了放置…

spring boot3多模块项目工程搭建-下(团队开发模板)

⛰️个人主页: 蒾酒 &#x1f525;系列专栏&#xff1a;《spring boot实战》 目录 写在前面 上文衔接 Common模块 DAO模块 Service模块 Web模块 API模块 写在最后 写在前面 本文介绍了springboot开发后端服务&#xff0c;多模块项目工程搭建&#xff0c;各模块的…

创建存储过程

查询语句 DDL CREATE TABLE student (id INT PRIMARY KEY AUTO_INCREMENT,createDate DATE NOT NULL,phone VARCHAR(20) NOT NULL,age INT NOT NULL,sex ENUM(男, 女) NOT NULL,introduce TEXT NOT NULL,userName VARCHAR(50) NOT NULL ); DML INSERT INTO student (create…

ERROR: tensorboard 1.14.0 has requirement setuptools>=41.0.0(问题解决)

问题描述&#xff1a; ERROR: tensorboard 1.14.0 has requirement setuptools>41.0.0, but youll have setuptools 39.2.0 which is incompatible. 问题原因&#xff1a; setuptools 版本太低 解决方法&#xff1a;升级setuptools版本 pip install --upgrade setuptools…

Java modbus 实现RTU串口作为slave(服务端)读写数据

这里要了解下modbus的RTU和TCP 的几个名称关系&#xff1a; Modbus/RTU&#xff1a;主站 和从站 关系 Modbus/TCP&#xff1a;客户端和服务端关系 关系 主站主动找从站读写数据 客户端主动找服务端读写数据 所以当使用Modbus/TCP时&#xff0c;主站一般作为客户端&#xff…