当前位置: 首页 > news >正文

windows 动态库和静态库 介绍

在Windows平台上,动态库和静态库都是用于组织和共享代码的方式。这些库文件的扩展名和用途有一些区别。

1. 静态库和动态库

  • 静态库(Static Library):

    • 文件扩展名:.lib
    • 在编译链接时,静态库的代码被直接嵌入到可执行文件中。
    • 优点:编译后的可执行文件独立,不依赖外部库文件。
    • 缺点:如果多个程序使用同一个静态库,会导致代码冗余。
  • 动态库(Dynamic Link Library):

    • 文件扩展名:.dll
    • 在编译链接时,程序只包含对动态库的引用,实际的代码在运行时才会加载。
    • 优点:节省内存,多个程序可以共享同一个动态库。
    • 缺点:程序运行时需要确保能找到对应版本的动态库。

2. Windows下的库文件

  • 静态库:

    • 静态库在Windows上通常使用 .lib 扩展名。例如:mylib.lib
    • 在使用静态库的项目中,需要在项目属性的链接器设置中添加 .lib 文件。
  • 动态库:

    • 动态库在Windows上通常使用 .dll 扩展名。例如:mylib.dll
    • 在使用动态库的项目中,需要在项目属性的链接器设置中添加 .lib 文件(这是用于链接动态库的导入库)。
    • 动态库还需要在运行时找到,可以将 .dll 文件放在程序可执行文件所在的目录,或者添加到系统路径中。

3. 导入库(Import Library)

  • 导入库是什么:

    • 在Windows上,用于链接动态库的 .lib 文件通常被称为导入库。导入库实际上是一种特殊的静态库,包含了调用动态库函数的信息。
  • 导入库的生成:

    • Visual Studio 编译动态库时,会自动生成一个与动态库同名但扩展名为 .lib 的导入库。
    • 这个导入库包含了动态库的函数信息,用于在链接时告诉编译器如何调用动态库中的函数。

4. 使用静态库的步骤

  1. 编写代码并编译成目标文件(.obj):

    cl /c mylib.cpp
    
  2. 将目标文件打包成静态库:

    lib /OUT:mylib.lib mylib.obj
    
  3. 在项目中链接静态库:

    • 在 Visual Studio 中,将 mylib.lib 添加到项目属性的链接器设置中。

5. 使用动态库的步骤

  1. 编写代码并编译成目标文件(.obj):

    cl /c mylib.cpp
    
  2. 编写代码并编译成动态库(.dll):

    cl /LD mylib.obj
    
  3. 在项目中链接动态库:

    • 在 Visual Studio 中,将 mylib.lib(导入库)添加到项目属性的链接器设置中。
    • mylib.dll 放置在可执行文件所在目录或者添加到系统路径中。

总结

  • 静态库和动态库都是在组织和共享代码方面的重要概念。
  • 静态库在链接时直接嵌入到可执行文件中,而动态库在运行时加载。
  • 在Windows上,静态库使用 .lib 扩展名,动态库使用 .dll 扩展名。
  • 链接动态库时需要使用导入库(.lib 文件)提供函数信息。

上文是简单的介绍,实际使用过程中可能还涉及到一些特殊情况和编译器/工具的不同行为。

相关文章:

windows 动态库和静态库 介绍

在Windows平台上,动态库和静态库都是用于组织和共享代码的方式。这些库文件的扩展名和用途有一些区别。 1. 静态库和动态库 静态库(Static Library): 文件扩展名:.lib在编译链接时,静态库的代码被直接嵌入…...

微软官方镜像下载大全(windows iso 官方镜像)

原本只是想下一个Windows Server 2022中文版的镜像,后面发现要么就是慢得一批的某盘,要么就是磁力,我想直接下载简简单单,找了一圈没有找到。官网下载需要注册、登录乱七八糟,最终终于找到下载方法了,适用于…...

ceph块存储学习

目录 ceph的组件和功能 ceph的数据读写流程 ceph存储池学习 ceph的组件和功能 Ceph OSD:功能是存储数据,处理数据的复制、恢复、平衡数据分布,并将一些相关数据提供给Ceph Monitor,。 Ceph Monitor: 功能是维护整个集群健康状态&…...

开发模型和测试模型

1. 开发模型 1.1 瀑布模型 瀑布模型是其他模型的基础框架 start—>需求分析---->计划----->设计----->编码----->测试----->End(其实就是软件开发的生命周期) 特点:线性的开发流程 缺陷:测试被后置。①风险往…...

Kubectl 部署简单应用

创建新服务 kubectl create deployment kubernetes-bootcamp --imagegcr.io/google-samples/kubernetes-bootcamp:v1 查看 kubectl get deployments 打开新的终端执行 kubectl proxy 此时,切回上一个终端,通过 kubectl get pods 可查看已部署好的pod。并…...

Flink电商实时数仓(三)

DIM层代码流程图 维度层的重点和难点在于实时电商数仓需要的维度信息一般是动态的变化的,并且由于实时数仓一般需要一直运行,无法使用常规的配置文件重启加载方式来修改需要读取的ODS层数据,因此需要通过Flink-cdc实时监控MySql中的维度数据…...

四种消息队列,如何选型

这篇文章,主要讲述 Kafka、RabbitMQ、RocketMQ 和 ActiveMQ 这 4 种消息队列的异同,无论是面试,还是用于技术选型,都有非常强的参考价值。 01 消息队列基础 1.1 什么是消息队列? 消息队列是在消息的传输过程中保存消…...

flutter开发windows应用的库

一、window_manager 这个插件允许 Flutter 桌面应用调整窗口的大小和位置 地址:https://github.com/leanflutter/window_manager二、win32 一个包,它使用FFI包装了一些最常见的Win32 API调用,使Dart代码可以访问这些调用,而不需…...

机器学习--线性回归

目录 监督学习算法 线性回归 损失函数 梯度下降 目标函数 更新参数 批量梯度下降 随机梯度下降 小批量梯度下降法 数据预处理 特征标准化 正弦函数特征 多项式特征的函数 数据预处理步骤 线性回归代码实现 初始化步骤 实现梯度下降优化模块 损失与预测模块 …...

【Spring Boot】面试题汇总,带答案的那种

继上次的文章【MySQL连环炮,你抗的住嘛?】爆火之后,越来越多的小伙伴后台留言,要求阿Q总结下其他的“连环炮”知识点,想在金九银十的面试黄金期轻松对线面试官。 同样为了节省大家的时间,阿Q最近对【Sprin…...

【大模型】快速体验百度智能云千帆AppBuilder搭建知识库与小助手

文章目录 前言千帆AppBuilder什么是千帆AppBuilderAppBuilder能做什么 体验千帆AppBuilderJava知识库高考作文小助手 总结 前言 前天,在【百度智能云智算大会】上,百度智能云千帆AppBuilder正式开放服务。这是一个AI原生应用开发工作台,可以…...

字符串压缩

...

MsSQL中的索引到底长啥样,查找过程怎么进行

参考文章一 参考文章二 建表 mysql> create table user(-> id int(10) auto_increment,-> name varchar(30),-> age tinyint(4),-> primary key (id),-> index idx_age (age)-> )engineinnodb charsetutf8mb4;insert into user(name,age) values(张三,…...

WPF 全局异常处理

在Application中存在三种异常事件EventHandler DispatcherUnhandledExceptionAppDomain.CurrentDomain.UnhandledExceptionTaskScheduler.UnobservedTaskException 其中 DispatcherUnhandledException 是在异常由应用程序引发但未进行处理时发生,但无法捕获多线程…...

Flink系列之:Elasticsearch SQL 连接器

Flink系列之:Elasticsearch SQL 连接器 一、Elasticsearch SQL 连接器二、创建 Elasticsearch表三、连接器参数四、Key 处理五、动态索引六、数据类型映射 一、Elasticsearch SQL 连接器 Sink: BatchSink: Streaming Append & Upsert ModeElasticsearch 连接器…...

java中将Map集合、对象、字符串转换为JSON对象

1、Map集合转JSON对象 创建一个Map集合&#xff1b; 新建json对象&#xff0c;并将Map引入json中。 public void demo1(){ //创建一个Map集合Map<String, String> map new HashMap<>();map.put("1729210001","zhangsan");map.put("17292…...

理解Spring中bean的作用域

singleton:Spring Ioc容器中只会存在一个共享的Bean实例&#xff0c;无论有多少个Bean引用它&#xff0c;始终指向同一个对象&#xff0c;作用域为Spring中的缺省&#xff08;同一package&#xff09;作用域 prototype:每次通过Spring容器获取prototype定义的bean时&#xff0c…...

edge中以右键“打印”的方式“保存”当前页面的pdf形式,下载过程中卡进度的问题

目录 问题描述&#xff1a; 可能的问题&#xff1a; 解决&#xff1a; 问题描述&#xff1a; 特殊情况下需要保存网页的pdf形式&#xff0c;但页面没有类似“导出pdf”的功能按钮&#xff0c;可以通过页面右键“打印”的方式“保存”当前页面的pdf形式。在pdf文件下载过程中出…...

c# 使用OpenCV

C#和OpenCV的结合主要通过一个名为OpenCVSharp的库实现。OpenCVSharp是一个C#包装器&#xff0c;它提供了对OpenCV&#xff08;一个开源的计算机视觉和机器学习库&#xff09;功能的访问。 安装OpenCVSharp NuGet包&#xff1a; 在Visual Studio中&#xff0c;右键点击你的项目…...

数据库连接问题 - ChatGPT对自身的定位

1.一段关于数据库连接的技术性对话 sweetie&#xff0c;连接数据库的时候&#xff0c;需要在每次读写数据后就把连接释放吗&#xff1f; 亲爱的&#xff0c;连接数据库后&#xff0c;通常会在每次读写数据后将连接释放。这是为了确保数据库连接的及时释放和有效管理。如果不及…...

第19节 Node.js Express 框架

Express 是一个为Node.js设计的web开发框架&#xff0c;它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用&#xff0c;和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...

AI Agent与Agentic AI:原理、应用、挑战与未来展望

文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例&#xff1a;使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例&#xff1a;使用OpenAI GPT-3进…...

基于Flask实现的医疗保险欺诈识别监测模型

基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施&#xff0c;由雇主和个人按一定比例缴纳保险费&#xff0c;建立社会医疗保险基金&#xff0c;支付雇员医疗费用的一种医疗保险制度&#xff0c; 它是促进社会文明和进步的…...

如何在最短时间内提升打ctf(web)的水平?

刚刚刷完2遍 bugku 的 web 题&#xff0c;前来答题。 每个人对刷题理解是不同&#xff0c;有的人是看了writeup就等于刷了&#xff0c;有的人是收藏了writeup就等于刷了&#xff0c;有的人是跟着writeup做了一遍就等于刷了&#xff0c;还有的人是独立思考做了一遍就等于刷了。…...

什么是Ansible Jinja2

理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具&#xff0c;可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板&#xff0c;允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板&#xff0c;并通…...

如何在网页里填写 PDF 表格?

有时候&#xff0c;你可能希望用户能在你的网站上填写 PDF 表单。然而&#xff0c;这件事并不简单&#xff0c;因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件&#xff0c;但原生并不支持编辑或填写它们。更糟的是&#xff0c;如果你想收集表单数据&#xff…...

基于 TAPD 进行项目管理

起因 自己写了个小工具&#xff0c;仓库用的Github。之前在用markdown进行需求管理&#xff0c;现在随着功能的增加&#xff0c;感觉有点难以管理了&#xff0c;所以用TAPD这个工具进行需求、Bug管理。 操作流程 注册 TAPD&#xff0c;需要提供一个企业名新建一个项目&#…...

return this;返回的是谁

一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请&#xff0c;不同级别的经理有不同的审批权限&#xff1a; // 抽象处理者&#xff1a;审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...

现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?

现有的 Redis 分布式锁库&#xff08;如 Redisson&#xff09;相比于开发者自己基于 Redis 命令&#xff08;如 SETNX, EXPIRE, DEL&#xff09;手动实现分布式锁&#xff0c;提供了巨大的便利性和健壮性。主要体现在以下几个方面&#xff1a; 原子性保证 (Atomicity)&#xff…...

如何更改默认 Crontab 编辑器 ?

在 Linux 领域中&#xff0c;crontab 是您可能经常遇到的一个术语。这个实用程序在类 unix 操作系统上可用&#xff0c;用于调度在预定义时间和间隔自动执行的任务。这对管理员和高级用户非常有益&#xff0c;允许他们自动执行各种系统任务。 编辑 Crontab 文件通常使用文本编…...