静态库和动态库的使用与区别
引文
库文件是计算机上的一类文件,可以理解为一种代码仓库,提供给使用者一些可以直接使用的变量、函数或类。
库文件分为两类:
- 静态库:在链接阶段,会将汇编生成的目标文件.o与引用到的库一起链接打包到可执行文件中。因此对应的链接方式称为静态链接。
- 动态库:动态库在程序编译时并不会被连接到目标代码中,而是在程序运行是才被载入。不同的应用程序如果调用相同的库,那么在内存里只需要有一份该共享库的实例,规避了空间浪费问题。
1. 静态库
1.1 静态库的制作
- 命名规则:
- Linux:libxxx.a
- lib: 前缀,固定
- xxx:库的名称,自起
- .a: 后缀,固定
- Windows:libxxx.lib
- Linux:libxxx.a
- 静态的制作
- gcc 获得 .o 文件
- 将 .o 文件打包,使用 ar(archive) 工具
命令:ar rcs libxxx.a xxx.o xxx.o
eg: arc rcs libsuanshu.a sub.o add.o mult.o div.o
1.2 静态库的使用
ydh@ubuntu:~/static_lib$ gcc main.c -o dest -I include/ -l calc -L lib/
解释如下:
-I include/:生成目标文件所需头文件路径
-l calc:调用的库的名称
-L lib/:调用的库的路径
注:调用静态库依旧需要附带头文件,比如上述例子中的静态库calc包含了add.o、sub.o、mult.o、div.o的函数体,但是我们依旧需要头文件 head.h 来告诉我们有哪些函数。
head.h 的内容如下:
#ifndef _HEAD_H
#define _HEAD_H// 加法
int add(int a, int b);
// 减法
int subtract(int a, int b);
// 乘法
int multiply(int a, int b);
// 除法
double divide(int a, int b);#endif
2. 动态库
2.1 动态库的制作
命名规则
- Linux:libxxx.so
- lib:前缀,固定
- xxx:库的名称,自定
- .so :后缀,固定
- Windows:libxxx.dll
- Linux:libxxx.so
动态库的制作
gcc 得到和位置无关的代码
gcc -c -fpic/-fPIC a.c b.c
gcc 得到动态库
gcc -shared a.o b.o -o libcalc.so
2.2 动态库的使用
报错原因:动态库是程序运行期间动态加载到程序中的,当找不到依赖的文件时报错
此时,可以通过 ldd(list dynamic dependencies)命令查看动态库依赖关系
2.3 动态库加载失败的解决方法
既然上述问题是因为无法找到动态(共享)库的位置,那我们如何定位动态库呢?
当系统加载可执行代码时,能够知道其所依赖的库的名字,但是还需要知道绝对路径。此时就需要系统的动态载入器来获取该绝对路径。对于elf格式的可执行程序,是由ld-linux.so来完成的,它先后搜索elf文件的DT_RPATH段–>环境变量LD_LIBRARY_PATH–>/etc/ld.so.cache文件列表–>/lib/,/usr/lib目录找到库文件后将其载入内存。
方式一:直接在终端进行配置。这种配置方式只在当前终端有效。
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:动态库路径
注:$ 为取值,:为拼接,上述命令表示将原来的动态库路径加上新的动态库路径
方式二:用户级别的,修改 .bashrc 文件,并重启该文件配置
vim .bashrc // 在文件的最后一行加上方式一的配置语句并退出(ESC + :wq) . .bashrc // 第一个点相当于source,即source bashrc
方式三:系统级别,修改 /etc/profile 文件,并重启该文件配置
vim /etc/profile // 在文件的最后一行加上方式一的配置语句并退出(ESC + :wq) . /etc/profile // 第一个点相当于source,即source /etc/profile
3. 静态库与动态库的区别
静态库优缺点
- 优点
- 静态库被打包到应用程序中加载速度快
- 发布程序无需提供静态库,移植方便
- 缺点
- 消耗系统资源、浪费内存
- 更新、部署、发布麻烦
- 优点
动态库优缺点
- 优点
- 可以实现进程间资源共享
- 更新、部署、发布简单
- 可以控制何时加载动态库
- 缺点
- 加载速度比静态库慢
- 发布时需要提供依赖的动态库
- 优点
说明: 参考视频https://www.nowcoder.com/study/live/504
静态库和动态库的使用与区别相关推荐
- 关于Linux静态库和动态库的分析
From: http://hi.baidu.com/bdccutysj/blog/item/5bae7f0202abac7c3912bb15.html 1.什么是库 在windows平台和linux平 ...
- C/C++ 静态库和动态库的区别
可执行目标文件 可重定位目标文件 共享目标文件 静态库和动态库的区别: 生效阶段不同,静态库是在编译阶段就会把其链接到可执行目标文件中:动态库是在程序运行过程中指定路径或者系统动态库路径下寻找. -l ...
- 静态库与动态库详细剖析
技术交流QQ群:1027579432,欢迎你的加入! 1.库的介绍 库是什么? 二进制文件: 将源代码(.c或.cpp文件)变成二进制格式的源代码: 加密操作(只能使用,无法知道源代码是什么): 库制 ...
- linux 中如何将文件粘贴到usr下的lib内,学会在Linux下GCC生成和使用静态库和动态库...
一.基本概念1.1什么是库 在windows平台和linux平台下都大量存在着库. 本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行. 由于windows和linux的平台不同(主 ...
- C 语言编程 — 静态库、动态库和共享库
目录 文章目录 目录 文章目录 程序函数库 静态链接 创建静态库文件 动态链接 创建共享库文件 共享库文件的名字 共享库文件的存储路径 LD_LIBRARY_PATH 环境变量 ldconfig 指令 ...
- NDK 编译和使用静态库、动态库
NDK 编译和使用静态库.动态库 情况一:编译静态库 情况二:编译动态库 情况三:编译动态库+静态库 情况四:已有第三方静态库(动态库),编译静态库(动态库) 默认所有代码和文件在$project/j ...
- Linux中gcc的编译、静态库和动态库的制作
欢迎大家关注笔者,你的关注是我持续更博的最大动力 Linux中gcc的编译.静态库.动态库 文章目录: 1 gcc的编译过程 1.1 gcc的编译过程 1.2 gcc的常用参数 2 gcc 静态库的制 ...
- Head First C 第八章 静态库与动态库 创建动态库
2019独角兽企业重金招聘Python工程师标准>>> Head First C 第八章 静态库与动态库 创建动态库 动态库是什么 静态库文件,需要在链接过程中和主程序链接在一起,如 ...
- Linux下的静态库、动态库和动态加载库
from: http://www.techug.com/linux-static-lib-dynamic-lib 库的存在极大的提高了C/C++程序的复用性,但是库对于初学者来说有些难以驾驭,本文从L ...
- 【Android NDK 开发】Android.mk 配置静态库 ( Android Studio 配置静态库 | 配置动态库与静态库区别 | 动态库与静态库打包对比 )
文章目录 I . Android Studio 中使用 Android.mk 配置静态库 总结 II . 第三方动态库来源 III . 配置 Android.mk 构建脚本路径 IV . 预编译 第三 ...
最新文章
- ACMNO.27 Python的两行代码解决 C语言-字符逆序 写一函数。使输入的一个字符串按反序存放,在主函数中输入输出反序后的字符串。 输入 一行字符 输出 逆序后的字符串
- keil编写正弦函数_【高中数学】62个重要函数图像
- 一个完整的DS1302时钟在STM32上的应用实例
- 一场开发与视觉的对话引发的思考
- ByteArrayOutputStream和ByteArrayInputStream详解
- 去除覆盖在文字上的水印_PDF文档密码移除与文字水印去除工具
- halcon使用点拟合圆形时候,点集顺序紊乱,不影响圆形拟合效果
- SpringBoot整合阿里云OSS文件上传、下载、查看、删除
- 各纬度气候分布图_地理:世界各种气候类型分布图(高清版)汇总!以及解答分析哦~...
- mysql升级准备工作
- Java Generics示例教程 - 通用方法,类,接口
- Linux系统基础(二)
- Failed to find any matching files for /tmp/resnet_v1_50.ckpt
- 隐藏Tabview顶部上的空白区域统一去掉图片名后缀
- [转载]Deep Learning·NLP·Representation
- matlab提取汉字拼音,中文转拼音工具
- Django学习 day61之Django第七日
- 什么是迁移学习?什么时候使用迁移学习?
- 菌群数据预处理-microbiome包
- 计算机工程+cssci,XC中文学术期刊等级分类目录
热门文章
- IDEA导入maven聚合项目
- java注释 神兽,代码注释,神兽护体,代码无bug
- 二分图匹配-匈牙利算法
- ros使用遇到的问题与解决方案
- 阿里云没有“引路人”
- 笔记本电脑显示计算机无法启动,笔记本电脑未能启动怎么回事_笔记本电脑显示windows未能启动如何解决-win7之家...
- android errcode 1,android 唤起支付失败。一直返回errCode=-1
- 机器学习之数据分析与特征工程
- 电源计划信息服务器,有关如何解决在 Windows 7 中的电源计划
- 开启1521端口监听_服务器1521端口被关闭,如何开启