Linux学习:静态库和动态库
1、库是什么?
将“源代码”变为“二进制格式的源代码”(作用:加密,别人可以用,但不知道其中的内容)。
2、库制作出来之后,如何给用户使用?
需要给用户:头文件(内含接口声明,相当于说明书),制作的库。
3、静态库的制作和使用(windows 中叫 .lib 库 Linux 叫.a 库)
(1)命名规则:libxxx.a,其中
lib: 静态库标识
xxx :库的实际名字
.a :Linux 静态库的后缀
(2) 制作步骤:
1)准备原材料:源代码.c /.cpp 例:a.c 和b.c。
2)将 .c 文件 生成 .o 文件 例:gcc a.c b.c -c // 生成 a.o b.o
。
3)将 .o 文件 打包 .a 库文件 例:ar rcs libxxx.a a.o b.o
。
4)发布: 将头文件(放入 include 目录)和库文件(放入 lib 目录),交给用户。
注意:查看静态库内容(包含什么 .o 文件): nm libxxx.a
(3)静态库使用:
1)使用时候,test.c 中要包含静态库的头文件。
2)在 test.c 中直接调用静态库中函数接口。
3)主要在编译:gcc test.c -I ./include/ -L ./ilb -l xxx -o app
: 生成 app 可执行程序。
注意:-I 是指定库的名字(掐头去尾)
4、动态库的制作和使用(windows 是 .dll 库 Linux 是.so 库)
(1)命名规则:libxxx.so
(2)制作步骤:注意 gcc 参数
1)准备原材料:源代码.c /.cpp 例:a.c b.c
2)将源文件生成.o 文件 例:gcc a.c b.c -c -fpic
。
3)将 .o 文件 打包 .so 库文件 例:gcc -shared a.o b.o -o libxxx.so
。
4)发布:将头文件(放入 include 目录)和库文件(放入 lib 目录),交给用户。
(3)动态库使用:
编译生成 app 可执行文件:gcc test.c -I ./include/ -L ./ilb -l xxx -o app
注意:此时直接运行程序 ./app,会动态加载失败(找不到 libxxx.so),会报错!
error while loading shared libraries:libxxx.so:cannot open shared object file:NO such file or dirrctory
本质:ldd app(检测 app 需要的所有动态库的存放路径和地址) 会发现 libxxx.so 出现not found
原因:
系统会先后从以下 4 个位置下寻找 动态库的路径,然后由动态连接器加载:
1)elf 文件的 DT_RPATH 段(位于可执行文件内部,不好修改)
2)环境变量 LD_LIBRARY_PATH
3)/etc/ld.so.cache 文件列表
4)/lib/ 或者 /user/lib 目录
解决:
方式 1:将 .so 文件拷贝至 /lib 目录(或者 /usr/lib 目录)
sudo cp lib/libxxx.so /lib
此方法不推荐:因为每个人都放入这个目录,如果有动态库重名,会出现覆盖的情况。
方式 2:更新 /etc/ld.so.cache 文件列表 (推荐此方法)
sudo vi /etc/ld.so.conf
-> 添加存放动态库的绝对路径 ->执行更新命令:sudo ldconfig
方式 3:设置环境变量
临时设置:关闭终端后会失效,只供测试用。
终端输入命令 :export LD_LIBRARY_PATH =存放动态库的绝对路径:$LD_LIBRARY_PATH
永久设置:
(1)用户级别 :
vi ~/.bashrc(打开配置文件)->将上方命令写入 -> 完成后重启终端。
(2)全局级别 :
vi /etc/profile(打开配置文件)->将上方命令写入 ->完成后重启终端。
5、 静态库和动态库的区别
(1)静态库:静态库被打包到应用程序中,即使不执行程序,库代码仍然在 app 中。
优点:使用简单;执行快;发布应用程序不需要发布库。
缺点:代码空间较大;库变更时应用程序需要重新编译。
(2)动态库:动态库没有被打包到应用程序中,只有在程序调用库函数的时候才会调用动态库。
优点:程序体积小;库变更时程序不需要重新编译(注意:函数接口变化,需要重新编译)。
缺点:使用相对麻烦(需要解决动态加载问题);执行慢;发布应用程序时需要发布库。
Linux学习:静态库和动态库相关推荐
- Linux静态库和动态库学习总结
一.废话 之前由于工作需要,要封装一个Linux加密解密转换的动态库,这个之前只做过Windows下面的,Linux下面还真没有做过,之后做了整一个晚上才算做好,不过其中也学到了不少东西,包括Linu ...
- 【Linux系统编程学习】 静态库与动态库的对比与总结
此为牛客网Linux C++课程 1.9 的课程笔记. 1. 前几节课知识总结 程序编译成为可执行文件的过程: 静态库制作过程: 动态库制作过程: 2. 静态库的优缺点: 3. 动态库的优缺点: 更多 ...
- [学习备忘录]Linux平台静态库、动态库的一些笔记
先声明几点: 1.操作系统:linux(fc9).编译器:gcc-4.3.0.编辑器:包括但不限于emacs.vim.这些无理由也不应造成限制. 2.生成的可执行文件名称比较有规律,仅仅是为了演示的方 ...
- linux系统应用学习(三)--- 动态库静态库
动态库静态库 库文件:一般指第三方提供的可调用的库函数文件,库文件封存的是函数体,即.c文件里面的内容. 动态库 静态库 Windows下: xx.dll ...
- Linux学习---静态库 动态库
今天我们主要来说说Linux系统下基于动态库(.so)和静态(.a)的程序那些猫腻.在这之前,我们需要了解一下源代码到可执行程序之间到底发生了什么神奇而美妙的事情. 在Linux操作系统中,普遍使用E ...
- linux下静态库和动态库学习
今天我们主要来说说Linux系统下基于动态库(.so)和静态(.a)的程序那些猫腻.在这之前,我们需要了解一下源代码到可执行程序之间到底发生了什么神奇而美妙的事情. 在Linux操作系统中,普遍使用E ...
- Linux 之三 静态库及动态库的编写和使用
最近在整理旧电脑时,发现了一些刚入行时的学习记录,以及最早使用新浪博客 http://blog.sina.com.cn/zcshou 写的一些文章.最近要重拾 Linux,所以把这些 Word 文 ...
- linux系统下的“静态库和动态库”专题之二:库的创建和使用
接上文[linux系统下的"静态库和动态库"专题之一:库的概念和规则]所述,我们通常把一些公用函数制作成函数库,供其它程序使用.函数库分为静态库和动态库两种. – 静态库在程序编译 ...
- linux分文件编程、静态库与动态库
参考:linux静态库与动态库编程 作者:丶PURSUING 发布时间:2021-02-02 16:51:49 网址:https://blog.csdn.net/weixin_44742824/art ...
最新文章
- 应用TP3.2.3的一些小问题(一)
- JS-WEB-API(存储)
- No ExecutorFactory found to execute the application.
- Java 各种日期/时间 对象转Long时间戳
- Android camera (12)---camera ap在特殊的应用场景下额外使用一套独立的camera tuning参数
- jq多选按钮值_关于jquery的多选框获取值和状态回显
- C语言家谱管理程序,C语言实现家谱管理
- C++中的接口继承和实现继承
- vue-cli关闭eslint及配置eslint
- Swift iOS : plist
- caffe上手:caffe训练一般过程--wanglei 写给自己
- Golang高效实践之array、slice、map实践
- java制作魔方_CSS3 制作魔方 - 玩转魔方
- 终于稀里糊涂完成了模仿天猫整站ssm
- JVM深入学习(十六)-垃圾回收器的分类和性能指标
- DirectX12(D3D12)基础教程(四)——初识DirectXMath库、使用独立堆创建常量缓冲、理解管线状态对象、理解围栏同步
- linux磁盘写保护怎么修改_用\RAID 0.0999\ 写保护 Linux 硬盘分区-me09-ChinaUnix博客...
- 中国机械式停车设备行业投资建议与发展机遇研究报告2022版
- 怎么让上下两排对齐_word中如何将上下两行间字、字符、数字分别对齐
- PHP打印输出log
热门文章
- USC提出拟牛顿法深度学习优化器Apollo,效果比肩SGD和Adam
- ​超越Transformer!AAAI 2021最佳论文:高效长序列预测模型
- 30万奖金海华AI挑战赛 | 用机器挑战中文阅读理解
- 追一科技热招职位来袭:AI新世界,不做旁观者
- 实录分享 | 计算未来轻沙龙:大规模数据存储与挖掘(PPT下载)
- Linux文件系统层次结构
- 风变python小课 基础语法12 作业1_菜鸟的风变编程Python小课之路,这么学编程也可以?...
- c语言编译器_学C语言写自己的K语言:编译器词法分析。
- java学习路线_java学习路线_我的入坑路
- python爬虫实训心得_Python爬虫小结