用gcc编译生成静态链接库*.a文件的方法

来源:互联网 发布:redis可视化工具 mac 编辑:程序博客网 时间:2024/06/06 16:46
1、用gcc的-c选项生成.o文件,如
gcc -c test1.c test2.c test3.c
编译后会生成test1.o test2.o test3.o三个目标文件。
2、然后用ar命令生成.a文件,如

ar crv test.a test1.o test2.o test3.o


我们知道静态库也称档案库,在此档案文件中实际上是收集了一系列的目标文件。这    
  些目标文件就是由cc(gcc)函数的源代码编译生成的。因此,静态库的生成方法实际上    
  可以分成两步:    
  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
     
    
  发信人:   hellguard   (小四),   信区:   Unix                  
  标     题:   顺便贴个生成linux动态库的    
  发信站:   BBS   水木清华站   (Fri   Nov   12   10:49:03   1999)    
   
  本来格式很好看的,但因为要贴到这里所以    
  扭曲了不少,见谅见谅。这里给的是linux下的例子,    
  但是solaris下的也差不多,如果你发现不同,就给    
  个详细说明出来,好不好。    
   
  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    
  )    
  export   LD_LIBRARY_PATH=.    
  (    
          编译时、运行时都需要这个变量的存在    
          编译时如果不存在这个变量,编译依旧通过,但    
          用ldd查看会发现没有动态连接信息    
          运行时如果不存在这个变量,将报告无法找到动态连接库    
   
          这个变量如果不用相对路径".",换了运行环境就比较麻烦    
          export   LD_LIBRARY_PATH=`pwd`:$LD_LIBRARY_PATH    
  )    
  gcc   -L.   -lbsd   -llinuxlib   -O3   -o   linuxkiller   linuxkiller.c    
  (    
          -L.   指出除标准库搜索路径之外的库搜索路径,如果不指    
          定,将找不到liblinuxlib.so    
          这个选项并不能代替   LD_LIBRARY_PATH   变量,否则虽然编译通过,    
          但用ldd   linuxkiller的时候会发现没有动态连接信息    
  )    
   
  可以把自己的动态连接库放到/usr/lib或者/lib下去,或者    
  修改/etc/ld.so.conf    
  然后利用/sbin/ldconfig。具体请man   ldconfig    
   
  --    
   
   
  发信人:   hellguard   (小四),   信区:   Unix                  
  标     题:   Re:   help   :static   library----what's   wrong--Thanks.    
  发信站:   BBS   水木清华站   (Thu   Aug   16   14:22:39   2001)    
   
   
  【   在   hululu   (呼噜噜~回家中)   的大作中提到:   】    
  :   I   am   building   a   static   library.   But   I   do   not   know   what   is      
  :   wrong.   Below   is   a   sample:      
  :   tt.c:      
  :   #include   <stdio.h>      
  :   int   func(){      
  :   printf("func   test\n");      
  :   return   0;      
  :   }      
  :   ii.c:      
  :   #include   <stdio.h>      
  :   extern   int   func();      
  :   ...................    
  ★   生成静态链接库举例    
   
          1.   vi   demo.h    
                void   demo   (   void   );    
   
                vi   demo.c    
                #include   <stdio.h>    
                #include   "demo.h"    
                void   demo   (   void   )    
                {    
                        printf(   "hello   world\n"   );    
                        return;    
                }    
   
          2.   g++   -Wstrict-prototypes   -Wall   -Wunused   -O3   -c   demo.c   -o   demo.o    
                file   demo.o    
   
          3.   ar   -rsv   libdemo.a   demo.o    
                a   -   demo.o    
                file   libdemo.a    
                nm   -s   libdemo.a    
                ar   -tv   libdemo.a      
          4.   vi   scz.c    
                #include   <stdio.h>    
                #include   "demo.h"    
                int   main   (   int   argc,   void   *   argv[]   )    
                {    
                        demo();    
                        return   0;    
                }    
   
          5.   g++   scz.c   -L.   -ldemo   -Wstrict-prototypes   -Wall   -Wunused   -O3   -o   scz