C++静态库和动态库用法

article/2025/8/30 6:42:17

1、前言

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

2、定义

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

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

3、优缺点

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

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

4、文件形式

TablesWindowsLinux
静态库.libLibxxx.a
动态库.dll与.liblibxxx.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文件。


http://chatgpt.dhexx.cn/article/WuP3hLYN.shtml

相关文章

Linux下的动态库和静态库详解

动态库和静态库 文章目录 动态库和静态库静态库与动态库的概念理解动静态库如何打包动静态库与如何使用动静态库如何制作打包动态库 为什么我们要使用别人(一般是顶尖的工程师写的)的代码? 为了开发效率和鲁棒性(健壮性) 如何使用别人的功能? 1、库 2、开…

静态链接库和动态链接库

一、前言 1、代码复用是提高软件开发效率的重要途径。 2、一般而言,只要某部分代码具有通用性,就可将它构造成相对独立的功能模块并在之后的项目中重复使用。小到一个函数、一种数据类型、一个类,大到一种类、一个模块、库。 3、复用从方式上…

linux之静态库与动态库

我们在写c语言的时候&#xff0c;经常会去包含一个.h的头文件&#xff0c;这个头文件就是库文件&#xff0c;比如<stdio.h>,<stdlib.h>这些都是标准的头文件&#xff0c;一般放在/usr/include,也就是说&#xff0c;从这个目录中我们可以找到这个头文件&#xff0c;…

理解和创建Windows和Linux下的动态和静态库区别

一、引言 在计算机编程的世界中&#xff0c;库是一个非常重要的改变。它的出现提供了一种共享和重用代码的可能性&#xff0c;复杂的程序因为动态库的出现而变得简洁和方便。然而&#xff0c;库并不是单一的&#xff1a;它们可以是动态的&#xff0c;也可以是静态的&#xff0…

静态库与动态库的区别和使用

动静态库所用到的一些库文件&#xff1a; .o 是目标对象文件,相当于windows中的.obj文件。可由一个或多个.c /.cpp来生成 .a 为静态库&#xff0c;可以是一个或多个.o合在一起,用于静态连接&#xff1b;多个.o文件可以链接生成一个.exe的可执行文件。静态库在程序编译时会被连…

静态库和动态库的使用与区别

引文 库文件是计算机上的一类文件&#xff0c;可以理解为一种代码仓库&#xff0c;提供给使用者一些可以直接使用的变量、函数或类。 库文件分为两类&#xff1a; 静态库&#xff1a;在链接阶段&#xff0c;会将汇编生成的目标文件.o与引用到的库一起链接打包到可执行文件中…

【Linux静态库和动态库】

Linux静态库和动态库 1. 编译与ELF格式2. 库的基本概念3.静态库的制作&#xff1a;&#xff08;假设要将a.c、b.c制作成静态库&#xff09;4.静态库的常见操作5.静态库的使用6. 多个库的相互依赖举例1.(库文件制作、错误处理) 7.静态库和动态库的关系和区别8.动态库的制作软链接…

如何理解静态库与动态库

究竟什么是库&#xff1a; 日常生活中有很多所谓的库&#xff0c;比如车库啊&#xff0c;优衣库啊&#xff0c;甚至还有一库&#xff08;日语&#xff09;咳咳。然后对程序员来说&#xff0c;所谓的库&#xff0c;即是程序库&#xff0c;当一段代码十分耐用&#xff0c;又经过…

C++静态库与动态库的区别

文章目录 什么是库静态库Linux下创建与使用静态库Windows下创建与使用静态库 动态库Linux下创建与使用动态库Windows下创建与使用动态库 动态库的显式调用在Linux下显式调用动态库在Windows下显式调用动态库显式调用C动态库注意点 附件&#xff1a;Linux下库相关命令g(gcc)编译…

动态库静态库的区别

1、动态库以及静态库区别 静态库是函数和数据编译进一个二进制文件里面&#xff08;.lib文件&#xff09;&#xff0c;在使用静态库链接成可执行程序的时候&#xff0c;链接器会复制静态库内的函数和数据进可执行程序里面(.EXE文件)&#xff0c;所以在加载库的时候不需要加载相…

详谈静态库和动态库的区别

一、什么是库&#xff1a; 库是写好的&#xff0c;现有的&#xff0c;成熟的&#xff0c;可以复用的代码。现实中每个程序都要依赖很多基础的底层库&#xff0c;不可能每个人的代码都从零开始&#xff0c;因此库的存在意义非同寻常。 本质上来说&#xff0c;库是一种可执行代…

【C语言】详解#define,#ifdef,#ifndef,#elif,#undef,以及相关运算符

1.明示常量 #define 预处理指令结尾不带&#xff1b;&#xff08;分号&#xff09;&#xff0c;在预编译的过程中使用宏的地方会进行展开&#xff0c;是用多少次就展开多少次&#xff0c;但是只替换 不计算&#xff0c;预处理器在发现程序中的宏后&#xff0c;会用宏等价的替换…

Vue 项目报错:‘$‘ is not defined ( no-undef )

错误描述 报错如上图所示&#xff0c;错误原因是不认识 $ 符&#xff0c;他是 JQuery 中得符号&#xff0c;我也确实引入了 JQuery&#xff1a; 解决办法 在 vue 项目的根目录下创建一个 .eslinttrc.js 文件&#xff0c;文件内容如下&#xff1a; module.exports {root: true…

undefined和is not defined区别

undefined定义&#xff1a; undefined是javascript的一种基本数据类型&#xff0c;变量未赋值或者函数没有返回值时返回。 xxx is not defined是一种错误类型&#xff0c;其完整形式是&#xff1a;Uncaught ReferenceError: xxx is not defined&#xff08;未捕获的引用错误&a…

#define #undef等基本知识

1、预处理符号 例子&#xff1a; #include <stdio.h> #define DEBUG_PRINT printf("FILE %s line %d:" \"x%d, y%d, z%d," \__FILE__,__LINE__,x,y,z) //或者如下: //#define DEBUG_PRINT printf( "File %s line %d:…

undefined和is not defined一样吗?

https://blog.csdn.net/sheldon178/article/details/48298151/ undefined和is not defined&#xff0c;字面意思看来没什么两样&#xff0c;不都是未定义吗&#xff1f; 在JavaScript中&#xff0c;可并非如此。 undefined定义如下&#xff1a; undefined是javascript的一种…

C++中 #define 与 #undef

define 宏指令 #define 与 # include类似,它的好处呢就是速度快,使用define定义函数可以减少函数调用的额外开销 define 主要体现在2个地方 1 定义一个值 2 定义一个函数或者说功能 #include <iostream> using namespace std; // 定义一个值 #define HELLO_WORLD "…

#define #undef 使用

#define 是宏定义 #define 的用法是非常多功能的&#xff0c;它不止能实现常量宏定义&#xff0c;开关&#xff0c;还能实现函数 #undef 是取消宏定义 在undef后面要加上你要取消的宏定义 不想取消在后面可以瞎写但是不能为空 例子 #include "stdio.h"int main(…

C语言 #undef的用法

C语言中#undef的语法定义是&#xff1a;#undef 标识符&#xff0c;用来将前面定义的宏标识符取消定义。 然而&#xff0c;在实际应用中&#xff0c;#undef到底可以用来做什么&#xff1f; 整理了如下几种#undef的常见用法。 1. 防止宏定义冲突 在一个程序块中用完宏定义后&…

Perl学习-undef值和defined函数

undef值 undef是未定义的意思&#xff0c;在Perl中&#xff0c;会假设undef的变量时0或者空字符串 如果当成数字&#xff0c;就是0如果当成字符串&#xff0c;就是空字符串 当成数字 1 $n 1;2 3 while($n < 10){4 $sum $n;5 $n 2;6 }7 8 print "The tota…