总结:
1、什么是库?
函数等代码封装的二进制已经编译的归档。
2、a r归档工具
3、采用库的方式管理代码优点:
容易组织代码
复用
保护代码版权
4、静态库的静态的含义:
编译好的程序运行的时候不依赖库。库作为程序的一部分编译连接。
5、静态本质:
就是目标文件的集合(归档)
6、-static可选
库的规范与约定
库命名规则:
lib库名.a.主版本号.副版本号.批号
库使用规则:
-l 库名 -L库所在目录 gcc main.c -omain -l demo2 -L.
四、动态库的编译
1、什么是动态库?(共享库)
动态库是可以执行,静态库不能执行。但动态库没有main,不能独立执行;动态库不会连接成程序的一部分;
程序执行的时候,必须需要动态库文件。
2、工具
ldd 查看程序需要调用的动态库 查看可执行文件 ELF 。
readelf -h 查看执行文件程序头
nm 查看库中的函数符号
3、动态库的编译
1、编译 -c -fpic(可选) position independent code
2 、连接
-shared
4、使用动态库
gcc 代码 动态库文件名
gcc 代码 -l库名 -L动态库所在路径
标准命名规则:
lib库名.so
lib库名.a -l 库名 -L 库所在路径
问题:
1、执行程序怎么加载动态库?
2、动态库没有作为执行程序的一部分,为什么还要动态库编译连接
连接器需要确定函数在动态库中的位置
动态库的加载:
1、找到动态库
2、加载动态库到内存
3、映射到用户的内存空间
系统对动态库查找规则:
/lib
/usr/lib
到环境变量LD_LIBRARY_PATH 指定的路径中查找
用例
缓冲机制:
把/lib: /usr/lib:LD_LIBRARY_PATH加载到缓冲 /sbin/ldconfig -v 刷新缓冲中so的搜索数据
综合应用:
输入两个数,计算两个数的和。
要求:输入与计算两个数的和封装成动态库来调用
使用libdl.so库
动态库加载的原理
动态库中函数的查找已经封装成库libdl.so
dlopen dlsym dlclose dlerro
例子:
总结:
1、编译连接动态库
2、使用动态库
3、怎么配置让程序调用动态库
4、掌握某些工具的使用:nm ldd lddconfig /objdump strip去掉多余的信息.
工具make的使用与makefile脚本
背景:
make 编译脚本解释
编译脚本makefile
make -f 脚本文件 目标
脚本文件
1、文本文件
2、基本构成语法:
基本单位目标target
目标名:依赖目标
\t 目标指令
\t 目标指令