Linux中的静态链接库分析与使用
定一个已经存在的成员名(类似任选项 b).
l:暂未使用 N:与count参数一起使用,在库中有多个相同的文件名时指定提取或输出的个数. o:当提取成员时,保留成员的原始数据.如果不指定该任选项,则提取出的模块的时间将标为提取出的时间. P:进行文件名匹配时使用全路径名.ar在创建库时不能使用全路径名(这样的库文件不符合POSIX标准),但是有些工具可以. s:写入一个目标文件索引到库中,或者更新一个存在的目标文件索引.甚至对于没有任何变化的库也作该动作.对一个库做ar s等同于对该库做ranlib. S:不创建目标文件索引,这在创建较大的库时能加快时间. u:一般说来,命令ar r...插入所有列出的文件到库中,如果你只想插入列出文件中那些比库中同名文件新的文件,就可以使用该任选项.该任选项只用于r操作选项. v:该选项用来显示执行操作选项的附加信息. V:显示ar的版本. 上面的这么多的选项,比较经常用到的就是有三个命令选项:r(插入)、c(创建)和s(建立索引),这三个选项往往是一起使用.现在假设有两个C文件,foo.c bar.c.将foo.c和bar.c编译为目标文件foo.o和bar.o,然后将这两个目标文件归档为一个静态链接库. // bar.c #include "foobar.h" char * bar(void) { printf("This is bar! library1 is calledn"); return ("bar"); } //foo.c #include "foobar.h" char * foo(void) { printf("This is foo!library2 is called!n"); return ("foo"); } //foobar.h #ifndef _FOOBAR_H_ #define _FOOBAR_H_ #include <stdlib.h> #include <string.h> #include <stdio.h> extern char *foo(void); extern char *bar(void); #endif #gcc -c -o foo.o foo.c #gcc -c -o bar.o bar.c #ar rcs libfoobar.a foo.o bar.o 这基于PC平台的,如果是对于嵌入式平台的构建静态链接库而言,过程也是完全一样,唯一需要改变的可能是所用的工具名称.比如,如果要是为ARM-Linux构建静态库,那么可能需要使用arm-linux-ar.这里还有一个工具是nm,它可以用来取得目标文件的符号(symbol)信息.这里,nm打印出了libfoobar.a中的两个符号:foo和bar.这两个符号表示的都是函数,因此它们的符号值为0,符号类型为T(text,即表示该符号位于代码段).一列给出的是符号的名称. #nm libfoobar.a foo.o: 0000000000000000 T foo U puts bar.o: 0000000000000000 T bar U puts 现的静态库是有了,要怎么使用这样的静态库呢.应用程序要使用静态库就要与静态库链接起来.这里假设有一个main.c的C文件.应用程序与静态库的链接是在编译期完成的. #gcc -g -o foobar main.c -L. -lfoobar zfz@zfz:~/program$ ./foobar This is foo!library2 is foo()=foo This is library1 is called bar()=bar -L.选项告诉链接器到当前目录下去找所要链接的静态库,-lfoobar则明确告诉链接器要与静态库libfoobar.a完成链接.这里要有-L.和后面有一个空格,也可以真把生成的文件Copy到/usr/lib目录下,这是系统默认搜索的目录. 静态链接库是一种“复制式”的链接过程.何谓“复制式”的链接过程呢,当静态链接库与应用程序链接时,链接器会将静态链接库复制一份到最终得到的可执行代码中去.比如:现在有两个应用程序A和B,两者都要用到libfoobar.a所提供的功能.那么,在编译链接A时,链接器将复制一份libfoobar.a到A最终的可执行代码中去,libfoobar.a中的调试信息也会被复制,同样,在链接B时,链接器也会复制一份libfo |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |