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平台代码实现
静态库和动态库的区别 什么是库 库是写好的,现有的,成熟的,可以复用的代码.现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始,因此库的存在意义非同寻常. 本质上来说,库是一种可 ...
随机推荐
- Ansible自动部署lnmp架构+上线电商
1.首先准备3台机器 ansible机器:192.168.52.34 目标主机:192.168.52.35 目标主机:192.168.52.36 2.关闭防火墙 [root@localhost ~]# ...
- 网络命令——last、lastlog、traceroute、netstat
1.last命令(查看目前和过去用户的登录信息) 2.lastlog命令(检查某用户上次登录的时间): 3.traceroute命令: 显示数据包到主机间的路径. 4.netstat命令: 查看本机已 ...
- 小胖守皇宫(VIJOS P1144 )题解
题目描述 huyichen世子事件后,xuzhenyi成了皇上特聘的御前一品侍卫. 皇宫以午门为起点,直到后宫嫔妃们的寝宫,呈一棵树的形状:某些宫殿间可以互相望见.大内保卫森严,三步一岗,五步一哨,每 ...
- 一篇文章把你带入到JavaScript中的闭包与高级函数
在JavaScript中,函数是一等公民.JavaScript是一门面向对象的编程语言,但是同时也有很多函数式编程的特性,如Lambda表达式,闭包,高阶函数等,函数式编程时一种编程范式. funct ...
- LCA的多种求法(超详细!!!)
倍增求LCA (1)树上倍增法 预处理 设f[x,k]表示x的2^k辈祖先,即从x向根节点走2^k步到达的节点.特别地,若该节点不存在,则令f[x,k]=0.f[x,0]就是x的父节点.可以得出f[x ...
- Gaussian Processes
原文地址:https://borgwang.github.io/ml/2019/07/28/gaussian-processes.html 一元高斯分布 概率密度函数:\[p(x) = \frac{1 ...
- 保存tensor至本地文件
path_temp = '../m39_data/temp3' #文件目录 file_name = os.path.join(path_temp, "setQ.txt") Q = ...
- Spring Boot通过Configuration配置多数据源
本文结合SpringBoot + MyBatis + MySql进行多数据源配置,DataSource信息采用自定义dataSource.properties进行配置. 1.文件结构如下: 2.1 p ...
- linux Ubuntu Centos 增加 TCP 连接数
https://blog.csdn.net/c359719435/article/details/80300433 查看max conn: cat /proc/sys/net/core/somaxco ...
- php 面试必备:各种缓存技术详解
这门课程以电商网站为例,通过具体场景模块实战,让你更系统的掌握缓存原理.使用场景等相关知识,帮助你构建完整的缓存知识体系,胜任实际开发中缓存的处理,提升代码性能! 从原理到场景 系统讲解PHP缓 ...