Linux下静态库与动态库的生成与使用

文件预览

文件目录树如下,如你所见,非常简单。

  • libtest/  
  • |-- lt.c  
  • |-- lt.h  
  • `-- test.c  

 

代码

#lt.c

  • /* lt.c 
  •  * 
  •  */  
  •   
  • #include <stdio.h>  
  •   
  • void myprint(void)  
  • {  
  •   printf("Linux library test!\n");  
  • }  



# lt.h

  • /* lt.h 
  •  *  
  •  */  
  •   
  • void myprint(void);  



#test.c

  • /* test.c 
  •  * 
  •  */  
  •   
  • #include "lt.h"  
  •   
  • int main(void)  
  • {  
  •   myprint();  
  •   return 0;  
  • }  

先看静态库

首先做成静态库 liblt.a 。

  • $ gcc -c lt.c -o lt.o  
  • $ ar crv liblt.a lt.o  




再者,链接。

  • $ gcc -o lt lt.o liblt.a

或者 $ gcc -o lt lt.o -L. -llt

注释:-L指定库所在路径,此处是在当前目录所以-L.,-l指定静态库的名称,比如库liblt.a,库名是lt,因此是-llt。

gcc -o lt lt.o liblt.a命令中没有指定库所在路径,是因为给定了完整的库liblt.a,会直接在当前目录下寻找库。但是如果使用-llt指定库名会在库的标准位置寻找库。但是我们的库在当前目录下,因此需要使用-L指定库路径。一般会将制作好的静态库拷贝到库目录下,ubuntu标准的目录是/user/lib/。这样在
使用-llt时就不必使用-L指定库的路径。
这个时候再来看他的引用库情况。

  • $ ldd test                                            //ldd  是用来查看链接那些动态链接库
  •         linux-gate.so.1 =>  (0xffffe000)  
  •         libc.so.6 => /lib/libc.so.6 (0xb7e29000)  
  •         /lib/ld-linux.so.2 (0xb7f6e000)  
动态库的生成

1>首先生成目标文件,但是此时要加编译器选项-fpic和链接器选项-shared,

gcc -fpic  -c  lt.c

生成中间文件add.o和sub.o

2>其次生成动态库

gcc  -shared –o  liblt.so  lt.o 

以上两部也可以合成一步搞定,做成动态库 liblt.so 。

  • $ gcc -c lt.c -o lt.o  
  • $ gcc -shared -Wall -fPIC lt.o -o liblt.so  


链接方法I,gcc在当前目录下寻找库,此时需要指明库的全名,包括库名前缀、后缀。

$ gcc  -o lt lt.c liblt.so

链接方法II,手动指定库路径,使用-l连接库名时需要指定库所在路径。


  • $ gcc -o test test.o -llt -L. /**/
  • 接下来运行可执行程序test:
  • $ ./test
  • 但是程序会提示如下错误

     error while loading shared libraries: libtiger.so: cannot open shared object file: No such file or direct

    这是因为程序运行时没有找到动态链接库造成的。程序编译时链接动态库和运行时使用动态链接库的概念是不同的,在运行时,程序链接的动态链接库需要在系统目录下才行。这样链接没有问题但是这样手动链接好的程序在执行时候仍旧需要指定库路径(链接和执行是分开的)。将动态链接库的目录放到程序搜索路径中,可以将库的路径加到环境变量LD_LIBRARY_PATH中实现:

    export LD_LIBRARY_PATH=`pwd`:$LD_LIBRARY_PATH

  • 另一种方式使用如下命令:
  • $ gcc-o test test.o -llt -B /path/to/.
  • 这里的-B 选项就添加 /path/to/.到gcc搜索的路径之中,这样链接没有问题,执行也没问题。
  • 3.方法见链方法III

链接方法III,拷贝到系统库里再链接,让gcc自己查找

  • $ sudo cp liblt.so /usr/lib  
  • $ gcc -o test test.o -llt  


这里我们可以看到了 -llt 选项,-l[lib_name] 指定库名,他会主动搜索
lib[lib_name].so 。这个搜索的路径可以通过 gcc --print-search-dirs来查找。

这个时候再来检测一下test程序的库链接状况(方法I情况)

  • $ ldd test  
  •         linux-gate.so.1 =>  (0xffffe000)  
  •         liblt.so => /usr/lib/liblt.so (0xb7f58000)  
  •         libc.so.6 => /lib/libc.so.6 (0xb7e28000)  
  •         /lib/ld-linux.so.2 (0xb7f6f000)  
参考地址
http://www.cnblogs.com/changefuture/archive/2011/12/22/2297460.html
http://www.oschina.net/question/54100_32476

你可能感兴趣的:(Linux下静态库与动态库的生成与使用)