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

来源:互联网 发布:唐青枫官方捏脸数据 编辑:程序博客网 时间:2024/05/29 16:47
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   sc

转载http://blog.csdn.net/focusjava/article/details/12647353

0 0
原创粉丝点击