快速业务通道

Linux中的静态链接库分析与使用

作者 佚名技术 来源 Linux系统 浏览 发布时间 2012-04-20
定一个已经存在的成员名(类似任选项 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 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号