C++静态库与动态库的区别
在日常开发中,其实大部分时间我们都会和第三方库或系统库打交道。在 Android 开发音视频开发领域,一般会用到 FFmepg、OpenCV、OpenGL 等等开源库, 我们一般都会编译成动态库共我们程序使用。对于类 unix 系统,静态库为 .a, 动态库为 .so。而 windows 系统静态库为 .lib, 动态库为.dll。
静态链接库
回顾程序编译的四个步骤:
预编译 -> 编译 -> 汇编 -> 链接
静态库和动态库就是在链接阶段行为不同,静态库会在链接阶段将汇编生成的目标文件 .o 与引用的库一起链接打包到可执行文件中。静态库其实就是一系列目标文件的集合,可以用 ar 工具打包生成。静态库特点有:
- 静态库对函数的链接在编译时期完成
- 程序在运行时与函数库再无关系
- 浪费资源空间,因为所有相关的目标文件都会被链接到一个可执行文件中
我们来看一个例子:
// 头文件 Math.hpp
#ifndef Math_hpp
#define Math_hpp
#include <stdio.h>
extern int add(int a, int b);
#endif /* Math_hpp */ // Math.hpp 实现文件
#include "Math.hpp" int add(int a, int b)
{
return a + b;
} // main.cpp main 函数入口
#include <iostream> extern int add(int a, int b); int main(int argc, const char * argv[]) {
// insert code here... using std::cout;
using std::endl; cout << "add 2 3: " << add(2, 3) << endl; return 0;
}
- -t: 按顺序显示归档中的文件名
- -d: 从归档中删除指定文件
链接静态库
clang++ main.cpp -L. -lmath -o main
生成成功后,执行 ./main 执行
解释下参数:
- -L: 表示要链接的库所在目录,如果不指定就会在系统 usr/lib 或 usr/local/lib 下查找
- -l: 指定链接时的动态库或静态库,如果有动态将会优先被链接
动态链接库
使用动态库的原因,正式因为静态库很耗费内存空间,并且静态库更新简直是灾难,如果库源码发生变动,那么静态库将不得不重新生成。
动态库特点如下:
- 延迟加载一些库函数,既用到才加载
- 动态库可以同时被多个程序共享,节省内存
借着上面的例子,显示动态库的使用,首先,生成动态链接库文件
clang++ Math.o -shared -fPIC -Wall -o libmath.so
生成动态链接库文件后,再使用如下命令生成可执行文件
clang++ main.cpp -L. -lmath -o main
执行 ./main
参数说明:
- -shared: 表示生成的是动态链接库
- -fPIC: 生成位置独立的代码,用于编译共享库。在任意内存空间都可以被加载
- -Wall: 生成所有警告信息
如果觉得本文不错,那就点个关注吧~ 关于更多的面试资料我已经整理成相关文档,需要的朋友可以点击获取。
C++静态库与动态库的区别的更多相关文章
- VS中Debug和Realease、及静态库和动态库的区别整理(转)
原文出自:http://www.cnblogs.com/chensu/p/5632486.html 一.Debug和Realease区别产生的原因 Debug 通常称为调试版本,它包含调试信息,并且不 ...
- VS中Debug和Realease、及静态库和动态库的区别整理
一.Debug和Realease区别产生的原因 Debug 通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序.Release 称为发布版本,它往往是进行了各种优化,使得程序在代码 ...
- iOS静态库和动态库的区别
一.什么是库? 库是共享程序代码的方式,一般分为静态库和动态库. 静态库:链接时完整地拷贝至可执行文件中,被多次使用就有多份冗余拷贝. 动态库:链接时不复制,程序运行时由系统动态加载到内存,供程序调用 ...
- iOS 静态库和动态库的区别&静态库的生成
linux中静态库和动态库的区别 一.不同 库从本质上来说是一种可执行代码的二进制格式,可以被载入内存中执行.库分静态库和动态库两种. 1. 静态函数库 这类库的名字一般是libxxx.a:利用静态函 ...
- iOS中的静态库与动态库,区别、制作和使用
如果我们有些功能要给别人用,但是又不想公开代码实现,比如高德地图.第三方登录分享等等,这时候我们就要打包成库了.库分静态库和动态库两种: 静态库:以.a 和 .framework为文件后缀名.动态库: ...
- Lib作为“静态库”与“动态库”中的区别
Lib作为“静态库”与“动态库”中的区别 0. 前言: 什么是静态连接库: 静态库在链接阶段,会将汇编生成的目标文件.o与引用到的库一起链接打包到可执行文件中.因此对应的链接方式称为静态链接. 为什么 ...
- iOS 中的静态库与动态库,区别、制作和使用
如果我们有些功能要给别人用,但是又不想公开代码实现,比如高德地图.第三方登录分享等等,这时候我们就要打包成库了.库分静态库和动态库两种: 静态库:以.a 和 .framework为文件后缀名.动态库: ...
- (转)iOS静态库与动态库的区别
一.什么是库? 库是共享程序代码的方式,一般分为静态库和动态库. 静态库:链接时完整地拷贝至可执行文件中,被多次使用就有多份冗余拷贝. 动态库:链接时不复制,程序运行时由系统动态加载到内存,供程序调用 ...
- 静态库和动态库的区别和win平台和linux平台代码实现
静态库和动态库的区别 什么是库 库是写好的,现有的,成熟的,可以复用的代码.现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始,因此库的存在意义非同寻常. 本质上来说,库是一种可 ...
随机推荐
- cloudevents 通用event 描述指南
cloudevents 是由cncf 组织管理的一个通用event描述指南 特性: 一致性 可理解性 可移植性 说明 cloudevents 不仅提供了核心描述,同时也包含了不同协议的指南说明(htt ...
- ABP 04 用户的创建
有这样一个问题,我忘记了密码,查了一下数据那张表,是加密了的,然后就有了这篇文章了. 往后台传的时候,还是传的明文. 请求的地址:/api/services/app/User/Create 用户还是挺 ...
- 洛谷P2949题解
若想要深入学习反悔贪心,传送门. Description: 有 \(n\) 项工作,每 \(i\) 项工作有一个截止时间 \(D_i\) ,完成每项工作可以得到利润 \(P_i\) ,求最大可以得到多 ...
- 2019.10.1 qbxt模拟题
第一题 考虑树上\(DP\),f[i][j][0/1]表示以\(i\)为根的子树,入读为零点的个数为\(j\),点\(i\)的入度为\(0\)/不为\(0\)时的方案数 转移的时候考虑\(u\)的一个 ...
- hlt 与 llt 相关
HLT:HIGH LEVEL TEST,通常指SDV/SIT/SVT等测试活动SDV : system design verification 系统设计验证 SIT : system integrat ...
- 记一次cpu指标异常的跟踪排查
问题描述: 最近在测试环境的服务器上,无意中发现cpu持续飙高.最高的时候达到了200%经过反复重启无效之后,决定挖掘深层次的原因 通过top命令打印出消耗cpu的pid,如图 通过ps -mp 24 ...
- <每日 1 OJ> -内存文件系统
蛮有意思的,主要考查链表和树结构的知识. 代码如下: ************************************************************************* ...
- maven 无法引入包 报错 处理方式
<!--orderquery thrift client定义--> <dependency> <groupId>com.sankuai.qcs</groupI ...
- mysql左连接查询结果不准确
现有四张表 表(1)res_resource_catalog 表(2)res_catalog_classify 表(3)res_resource_classify 表(4)res_resource_m ...
- create-react-app项目暴露webpack配置文件
create-react-app创建的react项目,webapck配置,默认情况下是在node_modules里面的,我们需要把它暴露到根目录上来. 执行 npm run eject 命令即可,一般 ...