Chinaunix首页 | 论坛 | 博客
  • 博客访问: 322093
  • 博文数量: 85
  • 博客积分: 3433
  • 博客等级: 中校
  • 技术积分: 844
  • 用 户 组: 普通用户
  • 注册时间: 2010-08-29 01:11
文章分类

全部博文(85)

文章存档

2013年(1)

2012年(12)

2011年(13)

2010年(59)

我的朋友

分类: LINUX

2012-09-06 17:35:02

静态库的生成方法实际上     
  可以分成两步:     
  1.将各函数代码所在的源文件编译成目录文件。例如,对于myfunc.c,可以用如下命令     
  将其编译成目标文件:     
                  gcc   -c   myfunc.c     
  当然在有多个源文件时,只需在gcc   命令行中将其分别列上就可以了。     
  经此一步我休养将能够得到各源文件的目标文件。对上例,将得到myfunc.o     
  2.将各目标文件收集起来放到一个静态库文件中。这主要借助于ar命令完成,如:     
                  ar   r  /usr/local/lib/libtest.a   myfunc.o     
 
建立动态链接库、并不需要用到其他的工具,借助于gcc命令即可完成。此时需在命令     
  行中加上-K   PIC和-G这两个选项,如下我们可以建立libtest的动态版本:                   
                  gcc   -K   PIC   -G   -o   $HOME/lib/libtest.so   myfunc.c
     

  ldd   filename就可以看到程序用到哪些库。     
    
  ld   -o   OUTPUT   /lib/crt0.o   hello.o   -lc     
  ld将输出最终结果文件   OUTPUT   ,     
  用到/lib/crt0.o   hello.o以及libc.a     
  libc.a来自标准库搜索路径,请参看-l选项的讨论     
    
  ld的选项顺序任意,可以重复,后面的将覆盖前面的。     
    
  gcc   -c   -fPIC   linuxlib.c   -O3   -o   linuxlib.o     
  gcc   -shared   -Wl,-soname,liblinuxlib.so.1   \     
          -O3   -o   liblinuxlib.so.1.0   linuxlib.o     
  (     
  ld   -m   elf_i386   -shared   -o   liblinuxlib.so.1.0   \     
          -soname   liblinuxlib.so.1   linuxlib.o     
  这个语句产生的文件更小,不知道二者有何区别     
  -o   liblinuxlib.so.1.0   这个文件名任意,关键是后面     
  两个符号连接要正确     
  当然推荐使用有意义的带版本信息的名字,包括       
  -soname   liblinuxlib.so.1     
  )     
  ln   -sf   liblinuxlib.so.1.0   liblinuxlib.so.1     
  (       
          运行时,dynamic   linker根据   -soname   \     
          liblinuxlib.so.1   去寻找liblinuxlib.so.1     
  )     
  ln   -sf   liblinuxlib.so.1   liblinuxlib.so     
  (       
          编译的最后一个步骤,ld命令根据   -llinuxlib       
          选项去寻找liblinuxlib.so     
  ) 
阅读(1980) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~