C++动态库和静态库_动态库和静态库调用方法

C++动态库和静态库_动态库和静态库调用方法1、前言从事软件工作也有两年了,C++静态库和动态库也用了不少,但都是依葫芦画瓢,一直没具体去研究一下二者的区别,加载方式等,今天花时间看了几篇博客,重新学习了一下,做出如下笔记。2、定义静态库和动态库从字面意思来看,区别就是静态和动态。而这里的静态和动态指的是库的链接阶段。可以看如下的编译过程。静态库:在链接阶段库将会与目标汇编后的目标文件.o一起打包生成可执行文件。成为可执行…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

1、前言

从事软件工作也有两年了,C++静态库和动态库也用了不少,但都是依葫芦画瓢,一直没具体去研究一下二者的区别,加载方式等,今天花时间看了几篇博客,重新学习了一下,做出如下笔记。

2、定义

静态库和动态库从字面意思来看,区别就是静态和动态。而这里的静态和动态指的是库的链接阶段。可以看如下的编译过程。

  • 静态库:在链接阶段库将会与目标汇编后的目标文件.o一起打包生成可执行文件。成为可执行文件的一部分,后续此库就可以消失了。也就是说在编译的最后一步(链接阶段),如果程序需要使用静态库,在这一步都会一起打包到可执行文件中。
  • 动态库:而动态库在编译阶段都不会有什么动作,只有在程序运行时才被加载,也就是动态库的链接是发生在程序运行时期的,它和可执行文件是分开的,只是可执行文件在运行的某个时期调用了它。

3、优缺点

分清楚二者区别之后,二者的优缺点就自然可以分出来了。

优点 缺点
静态库 1、 使可执行文件依赖项少,已经被打包到可执行文件中了
2、 编译阶段完成链接,执行期间代码装载速度快
1、 使可执行文件变大
2、 若作为其他库的依赖库,将会造成多余的副本,因为必须与目标文件打包
3、 升级不方便,升级必须重新编译
动态库 1、 动态库可以实现进程之间资源共享,有一份就行
2、 升级程序简单,不需要重新编译
1、 运行期间在加载,将会减慢代码执行速度
2、 增加程序的依赖项,必须跟着可执行文件一起

4、文件形式

Tables Windows Linux
静态库 .lib Libxxx.a
动态库 .dll与.lib libxxx.so

5、生成和加载方式

这里我仅讨论windows下的使用vs的情况。

5.1、静态库:

生成:

在创建win32控制台程序或者win32项目的时候,勾选静态库就可以,进入项目后也可打开工程“属性面板”—》”配置属性”—》”常规”—》配置类型选择静态库。
这里写图片描述
创建好之后,里面在就正常的写函数或者类,将接口放在.h头文件中,编译后边生成了静态库。
测试代码:

  • 头文件:
    这里写图片描述
  • 源文件:
    这里写图片描述
  • 生成静态库:
    这里写图片描述

Vs中加载

需要文件、接口头文件、.lib库文件。

方式1

步骤1:包头文件。工程“属性面板”—》”配置属性” —》“C/C++” —》” 常规”,在“附加包含目录”属性值中,键入StaticLib.h 头文件所在目录的路径或浏览至该目录。
这里写图片描述
步骤2:“属性面板”—》”配置属性”—》“链接器”—》”常规”,附加依赖库目录中输入,静态库所在目录;
这里写图片描述
步骤3:“属性面板”—》”配置属性”—》“链接器”—》”输入”,附加依赖库中输入静态库名StaticLib.lib。
这里写图片描述
步骤4:使用,引用头文件,即可使用里面的接口。
这里写图片描述

方式2

步骤1同方式1。
步骤二:
打开工程“属性面板”—》”配置属性” —》“链接器”—》”命令行”,输入静态库的完整路径即可。
这里写图片描述
方式3:
步骤1同方式1。
步骤2:前提,加载的静态库属于同一解决方案。
工程“属性面板”—》“通用属性”—》 “框架和引用”—》”添加引用”,将显示“添加引用”对话框。 “项目”选项卡列出了当前解决方案中的各个项目以及可以引用的所有库。 在“项目”选项卡中,选择 StaticLib。 单击“确定
这里写图片描述
方式4: 在文件中使用#pragma comment()指定.lib文件的位置。如图
这里写图片描述

5.2、动态库

生成

在创建win32控制台程序或者win32项目的时候,勾选Dll就可以,进入项目后发现自动生成一些文件。如图
这里写图片描述
我们还是正常定义和实现函数或者类,特别的是动态库生成的时候需要在接口前加上
__declspec(dllexport),而导入的时候需要加__declspec(dllimport)。
这里使用通常的宏定义做法,如图所示。
头文件:
这里写图片描述
源文件:
这里写图片描述
生成动态库:
这里写图片描述
这里需要注意,生成两个有用文件,一个是.lib,一个是dll。这里的.lib本质上不同于静态库中的.lib。这里的.lib一般是一些索引信息,记录了dll中函数的入口和位置,dll中是函数的具体实现。而静态库中的lib包含了索引和实现。

加载动态库

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

隐式加载

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

显示加载

所需文件:dll文件。
利用LoadLibrary()函数进行加载。如图
这里写图片描述
按道理不需要.h头文件,但是前提是你知道接口是啥样的。
隐式加载和显示加载区别很明显,显示加载使用灵活,需要时加载,用完卸载,而隐式加载伴随着整个程序的生命周期。

6、总结

库分为静态库和动态库。静态库与可执行文件打包,动态库与可执行文件独立。静态库加载需要.lib和.h文件。动态库隐式加载需要.dll、.h、.lib文件,显示加载只需要.dll文件。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/187719.html原文链接:https://javaforall.net

(0)
上一篇 2022年9月29日 下午8:00
下一篇 2022年9月29日 下午8:00


相关推荐

  • mysql完整字段包括_MySQL字段类型最全解析

    mysql完整字段包括_MySQL字段类型最全解析前言 要了解一个数据库 我们必须了解其支持的数据类型 MySQL 支持大量的字段类型 其中常用的也有很多 前面文章我们也讲过 int 及 varchar 类型的用法 但一直没有全面讲过字段类型 本篇文章我们将把字段类型一网打尽 讲一讲常用字段类型的用法 常用的字段类型大致可以分为数值类型 字符串类型 日期时间类型三大类 下面我们按照分类依次来介绍下 1 数值类型数值类型大类又可以分为整型 浮点型

    2026年3月19日
    2
  • SENet实战详解:使用SE-ReSNet50实现对植物幼苗的分类

    SENet实战详解:使用SE-ReSNet50实现对植物幼苗的分类摘要 1 SENet 概述 Squeeze and ExcitationNe 简称 SENet 是 Momenta 胡杰团队 WMW 提出的新的网络结构 利用 SENet 一举取得最后一届 ImageNet2017 竞赛 ImageClassif 任务的冠军 在 ImageNet 数据集上将 top 5error 降低到 2 251 原先的最好成绩是 2 991 作者在文中将 SENetblock 插入到现有的多种分类网络中 都取得了不错的效果 作者的动机是希望显式地建模

    2025年7月23日
    5
  • 字符缓冲流 BufferedWriter写入数据

    字符缓冲流 BufferedWriter写入数据创建 student txt 文件 并用 BufferedWrit 写入字符串和换行符 importjava io publicclassI publicstatic String args throwsIOExce FileWriterfw newFileWrite F stude

    2025年10月30日
    4
  • golang 2021.8.3 激活码【最新永久激活】

    (golang 2021.8.3 激活码)2021最新分享一个能用的的激活码出来,希望能帮到需要激活的朋友。目前这个是能用的,但是用的人多了之后也会失效,会不定时更新的,大家持续关注此网站~https://javaforall.net/100143.htmlIntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,上面是详细链接哦~S3…

    2022年3月26日
    126
  • 【小程序】手把手带你完成微信小程序开发实践

    【小程序】手把手带你完成微信小程序开发实践帐号相关流程注册范围企业政府媒体其他组织换句话讲就是不让个人开发者注册。:)填写企业信息不能使用和之前的公众号账户相同的邮箱,也就是说小程序是和微信公众号一个层级的。填写公司机构信息,对公账户信息绑定管理员微信企业认证公司对公账户对微信进行打款账户自动验证后,自动认证通过,并将认证资金退回公司对公账户,费用在1元内随机小程序发布流程开发实践这次的demo项目为农历和公历的转换器,重在体验

    2026年2月17日
    3
  • vps怎么传文件_服务器搭建vps

    vps怎么传文件_服务器搭建vpsvps搭建文件服务器内容精选换一换方法一:在VSCode上选择“文件>首选项>设置”,再选择“工作区”,并在输入框搜索“kunpeng.remote.ssh.machineinfo”,单击“在settings.json中编辑”后生成settings.json文件。如图1所示。生成settings.json文件方法二:在VSCode上选择“资源管理器”,找到“.vs例如main…

    2025年8月12日
    5

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号