1,库的命名和编号约定:
库名都以lib开头
库文件名都.a(代表存档,archive)为静态库,以.so结尾的库为动态库.
编号约定 library_name.major_num.minor_num.patch_num.分别为“库名.主版本
号.次版本号.补丁级别号".
2,nm命令:
命令nm列出編入目标文件或二进制文件的所有的符号.可以查看程序调用什么函
数,也可以查看给定的库或目标文件是否提供了所需的函数.
nm [options] file
关于参数和更詳細介绍可以参看man手册.
3,ar命令:
用来操作高度结构化的存档文件.可以用来创建静态库,创建,维护符号名的交
叉索引表.
ar [dumqrtx] [member] archive files...
4,ldd命令
ldd [options] file
ldd输出file所要求的共享库的名字.
5,ldcofig
ldconfig [options] [libs]
决定位于目录/usr/lib和/lib下共享库所需的运行的链接,这些链接在命令行上
的libs指定并被保存在/etc/ld.so.conf中.命令ldconfig和动态链接/装载工具
ld.so协同工作,一起来创建和维护对最新版本共享库的链接.
6,动态链接器/加载器ld.so使用两个环境变量:
$LD_LIBRARY_PATH,一个由冒号分隔的目录清单,在这些目录下搜索运行时的共享
库.
$LD_PRELOAD ,一个由空格分隔的,附加的,用户指定的共享库,在其它所有库加
载之前加载.
还有,除了标准目录/usr/lib和/lib以外,清单/etc/ld.so.conf中列出了链
接/加载器搜索共享库时要查看的目录.
7,编写使用静态库
1》把代码编译为目标文件形式:
$ gcc -c libxxx.c -o libxxx.o
2》用工具ar创建一个存档文件
$ ar rcs libxx.a libxxx.o
使用时注意-static项
如: $ gcc test.c -o test -static -L. -lxxx
在当前命令下查找库文件libxxx
8,编写使用共享库
共享库好处:1,并没有被包含进其它各个文件,项目占用磁盘空间少.
就像不是每个人都去买一份游戏光盘,而是这些人只买一个,然后,可以选择装在
各自的机器上.
2,占用内存资源也较少,同上理,它只向内存中加载一次,供其它来使用.
3,代码维护简单,有时只需要更新类库就可以了,不用大动干戈去重新编译所
有.
创建共享库:
1,编译目录时使用gcc的-fPIC选项,这能产生与位置无关的代码并能加载到任
何地址...神奇..
2,使用gcc的-shared 和 -soname选项
3,使用gcc的 -wl选项把参数传递给链接器ld.
4, 使用gcc的 -l 选项显式的链接C库,以保证可以得到所需的启动
(startup)代码,从而避免程序在使用不同的,可能是不兼容的C库的系统上不能
启动执行.
编译:
$ gcc -fPIC -g -c libxxx.c -o libxxx.o
链接库:
$ gcc -g -shared -Wl,-soname,libxxx.so -o libxxx.so.1.0.0 libxxx.o
符号链接:
$ ln -s libxxx.so.1.0.0 libxxx.so
9,ld 动态加载共享对象
1,加载共享对象:
void *dlopen(const char *filename ,int flag);
以flag指定的模式加载由filename指定的共享对象.filename可以为绝对路径
名,一个文件名,或NULL.如果NULL,打开当前执行的文件,即你的应用程序.如
果是文件名,从以下搜索:
$LD_LIBRARY_PATH, /etc/ld.so.cache, /usr/lib, /lib
2,使用共享对象
void *dssym(void *handle, char *symbol);
3,检查错误:
const char *dlerror(void);
4,卸载共享对象:
int dlclose(void *handle); 本文出自 “WIK” 博客,请务必保留此出处http://noyear.blog.51cto.com/819034/399274
|