Linux下静态库与动态库
来源:互联网 发布:蚂蚁活多久 知乎 编辑:程序博客网 时间:2024/05/16 10:43
静态库:在可执行程序之前就已经加载到可执行程序的代码中,是可执行程序的一部分。一般以.a作为静态库文件的后缀名,使用ar(archiver)命令可以创建静态库。
优点:不会因为库文件的丢失而出现运行失败 缺点:维护和更新困难
静态库:储存的是目标文件打包后形成的一个库文件
生成步骤:
1.编译源文件1 源文件2 ...
2.b编译成目标文件1 目标文件2...
3.打包成静态库 以lib开头.a结尾
4. 链接:gcc/g++ main.c -L(oadFilePath).(没有指定目录回去环境变量下去寻找) -l(ib)库文件名.a -o 输出文件
以冒泡排序为例
bubble_sort.cpp文件
bubble_sort.h文件main.cpp文件跟随下面这些步骤可以生成静态库,以及如何链接静态库动态库
编译阶段并不是可执行程序的一部分,而是在运行阶段需要此动态库时才进行导入。
动态库生成步骤:
1.编写源文件
2.生成可执行的库文件 gcc/g++ -fPIC -shared -o lib*.so
3.加载库文件(分为两种 共享加载 动态加载)
共享加载 编译时指定动态库
我们还是以冒泡排序为例子
我们发现程序在运行阶段无法正确加载共享库,这是为什么呢?首先我们可以肯定,这肯定是共享库(在运行阶段产生错误),这是要给大家列出几个命令
ldd ->查找可执行文件的库的依赖关系 还有下面用到的nm->列出符号名的关系,我们使用ldd查看我们的可执行文件,看一下库文件的依赖关系。
我们发现libsort库并没有像其他库一样指向某个地方,原因就是因为在运行阶段我们仅仅只是把符号表导入了进来.
这时候又涉及到一个新的知识点,每个进程都有自己的LD_LIBRARY_PATH(在需要库文件时,系统会去该路径下去寻找库文件如果没有,就会出现错误),我们试着输出该环境变量的值
我们发现该环境变量为空.这是我们设置其值。看能否成功
程序正常运行,还有一种方式就是将,libsort.so文件放入到usr/lib/下程序同样可正确运行
静态库拓展
共享库一般有会有多个名字
real name (库名.so.主版本号.次版本号) so name(库名.so.主版本号) link name(库名.so)
我们为了在实际开发过程中同时会设置相关的名字
动态加载
- linux下动态库与静态库
- Linux下动态库与静态库
- Linux下动态库与静态库
- Linux下静态库与动态库
- Linux下动态库与静态库
- Linux下静态库与动态库
- linux操作系统下编译静态库与动态库
- Linux下动态链接库与静态链接库比较
- linux下的静态库与动态库
- linux下创建静态库与动态库
- Linux下静态库与动态库的使用
- Linux下静态库与动态库(.a、.so)
- Linux下静态库与动态库的使用
- linux下动态库与静态库实例
- linux下生成动态库与静态库
- Linux下的静态库与动态库
- linux下的静态库与动态库的区别
- linux下生成动态库与静态库
- 最短路径—Dijkstra算法和Floyd算法
- govendor的使用
- 【JZOJ 5270】神奇的矩阵
- 丑数、丑数 II
- Android打造全方位滚动的ListView
- Linux下静态库与动态库
- 神经网络与深度学习笔记(四)为什么用交叉熵代替二次代价函数
- Java并发-线程之间的协作
- Segnet分割网络caffe教程(一)
- sqlite3常用命令&语法
- [设计模式](二):工厂模式(简单工厂|静态工程、工厂方法|多工厂、抽象工厂)
- Python中re的用法示例
- Node创建服务器对象
- byte类型运算细节