永远年轻,永远热泪盈眶!
分类: LINUX
2014-08-16 19:41:26
一、静态库的编译
1.编译过程(*.a(静态库扩展名) achieve)
1.1.编译成目标文件
-static 可选
gcc -c -static 代码文件.c
-c 只编译不连接
1.2.归档成静态库(专门工具ar与nm)
ar工具
ar -r
-t (-p -x -m -q 不常用)
ar -r 静态库文件 被归档的文件(创建静态库)
#ar -r ku.a ku1.o ku2.o
#ar -t ku.a
nm工具(查看函数符号表) #nm ku.a
nm 静态库或者动态库或者目标文件或者执行文件
1.3.使用静态库
gcc 文件代码 静态库 -o 文件
(把静态库作为代码的一部分来编译)
总结:
1.什么是库?(文件的封装或归档)
函数等代码封装的二进制已经编译的归档文件
2.ar归档工具
3.采用库的方式管理代码优点:
容易组织代码
复用
保护代码版权(如将算法程序编译成静态库提供给用户)
4.静态库的静态的含义:
编译好的程序运行的时候不依赖库。
库作为程序的一部分编译连接。
5.静态库的本质:
就是目标文件集合(归档)
6.-static可选
2.库的规范与约定
库命名规则:
lib库名.a.主版本号.副版本号.批号
lib库名.a
#ar -r libku.a ku1.o ku2.o
库的使用规则:
-l 库名(空格可省)
-L 库所在目录 #gcc main.c -o main -l ku -L . (系统自动加上lib,自动搜索.a .so后缀)
二、动态库的编译 (库就是封装)
1.什么是动态库?(Linux系统称共享库)
动态库是可以执行,静态库不能执行
但动态库没有main,不能独立执行。
动态库不会连接成程序的一部分。
程序执行的时候,必须需要动态库文件。
2.工具
ldd 察看程序需要调用的动态库
ldd 只能察看可执行文件.(ELF执行连接格式)
readelf -h 察看执行程序头部信息.
nm 察看库(动态库和静态库)中的函数符号
3.动态库的编译
3.1.编译 position independent code(位置无关代码)
-c -fpic(可选)
3.2.连接
-shared
(编译时只能一个代码一个个编译,连接可以连接多个)
#gcc -c -fpic iotool.c #gcc -c -fpic grapic.c
#gcc -shared -o libdemo4.so iotool.o graphic.o
4.使用动态库 (库名不含lib .a .so)
gcc 代码 动态库文件名
gcc 代码 -l库名 -L动态库所在路径 (标准形式)
(编译后的可执行文件不一定能运行,所加载的动态库需要加载到内存空间)
标准命名规则:
lib库名.so
lib库名.a
-l 库名 -L 库所在路径
问题:
4.1.执行程序怎么加载动态库?
4.2.动态库没有作为执行程序的一部分,为什么连接需要指定动态库以及目录?
连接器需要确定函数在动态库的中的位置
动态库的加载:
1.找到动态库(用户指定查找目录)
2.加载动态库到内存
3.映射到用户的内存空间 (后两项由系统操作)
系统对动态库查找规则:windows/system32/中
/lib /usr/lib
到环境变量LD_LIBRARY_PATH指定的路径中查找
缓冲机制:(不是一个个找,而是启动时加载到缓冲)
把/lib:/usr/lib:LD_LIBRARY_PATH加载到缓冲。
/sbin/ldconfig -v 刷新缓冲中动态库.so的搜索路径。
#export LD_LIBRARY_PATH=.:..:~LFH