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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 1/7的小数点后2020位的数字是_九八K

    1/7的小数点后2020位的数字是_九八K给定长度为 N 的整数序列 A,下标为 1∼N。现在要执行 M 次操作,其中第 i 次操作为给出三个整数 li,ri,ki,求 A[li],A[li+1],…,A[ri] (即 A 的下标区间 [li,ri])中第 ki 小的数是多少。输入格式第一行包含两个整数 N 和 M。第二行包含 N 个整数,表示整数序列 A。接下来 M 行,每行包含三个整数 li,ri,ki,用以描述第 i 次操作。输出格式对于每次操作输出一个结果,表示在该次操作中,第 k 小的数的数值。每个结果占一行。数据范围

    2022年8月9日
    10
  • 杭电1396

    杭电1396一道简单的找规律的题,昨天下午看的,晚上上物理课时想了想,本打算昨天晚上回寝室提交的,结果xd在寝室非要看什么微电影,,,我擦,,,结果一微微了125分钟。。。。。。。今天上午第一次提交,,,竟然wr,,,让我很是震惊,,,明明思路没错的啊。后来仔细想了想,我擦,,竟然还有倒着的三角形。。。。无语。下面是题:Givenanequilateraltrianglewithnthe…

    2022年8月12日
    4
  • Istio入门(dignity)

    1.简介在本教程中,我们将介绍服务网格的基础知识,并了解它如何实现分布式系统架构。我们将主要关注Istio,它是服务网格的一种具体实现。在此过程中,我们将介绍Istio的核心架构。2.什么是服务网格?在过去的几十年中,我们已经看到了单体应用程序开始拆分为较小的应用程序。此外,诸如Docker之类的容器化技术和诸如Kubernetes之类的编排系统加速了这一变化。尽管在像Kubernetes这样的分布式系统上采用微服务架构有许多优势,但它也具有相当的复杂性。由于分布式服务必须相互通信,因

    2022年4月18日
    42
  • 长江商学院营销学李洋教授分析大数据与精准营销

    长江商学院营销学李洋教授分析大数据与精准营销  精准营销是大数据应用领域的重要课题之一,大数据时代的精准营销可以让企业以最小的营销成本获得最大的收益。那么我们如何利用企业大数据做精准营销呢? …

    2022年7月21日
    34
  • nfs41client loaded successfully_storcli创建raid

    nfs41client loaded successfully_storcli创建raid1、系统准备系统:ubuntu14.04,按照官网系统需要安装以下环境 环境 说明 安装配置方法 Ccompiler 编译器 移植时configure配置为交叉编译器 make 执行Makefile Ubuntu…

    2022年8月15日
    8
  • 离心泵CAE_2_ICEM剖分网格_2_叶轮流道[通俗易懂]

    离心泵CAE_2_ICEM剖分网格_2_叶轮流道[通俗易懂]针对本科毕设中所涉及到的离心泵数值分析和性能计算,将用最简单粗暴的方法,讲解如何基于CFturbo、ICEM、FLUENT来开展离心泵水力设计和性能分析的计算机辅助(CAE)实现。离心泵的水力设计由CFturbo软件实现;网格剖分由ICEM软件实现;CFD数值计算由FLUENT软件实现;并验证设计值是否达到。这里是第二部分,ICEM软件实现离心泵过流通道的网格剖分,含叶轮流道、进口延伸段、蜗壳流道的网格剖分。由于三个流道分开来划分网格,所以分三部分来分别讲解,这里是第2篇,叶轮流道的网格剖分……

    2022年5月26日
    47

发表回复

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

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