> Linux教程 > Linux学习 >

linux 下面 静态库 、 动态库的生成 及其使用

1、静态库 《来自博客:http://blog.csdn.net/stpeace/article/details/47030017》

       步骤一:

       写test.h文件, 内容为:

  1. void print();  

       写test.c文件, 内容为:
 
  1. #include <stdio.h>  
  2. #include "test.h"  
  3. void print()  
  4. {  
  5.     printf("I am a little bit hungry now.\n");  
  6. }  
      
       步骤二:制作静态链接库, 如下:
 
  1. [taoge@localhost learn_c]$ ls  
  2. test.c  test.h  
  3. [taoge@localhost learn_c]$ gcc -c test.c  
  4. [taoge@localhost learn_c]$ ls  
  5. test.c  test.h  test.o  
  6. [taoge@localhost learn_c]$ ar rcs libtest.a test.o    //注释: ar -r  libtest.a test.o  亦可
  7. [taoge@localhost learn_c]$ ls  
  8. libtest.a  test.c  test.h  test.o  
  9. [taoge@localhost learn_c]$   
       看到没, 这就生成了libtest.a静态链接库。 当然, 制作者有必要对这个库进行测试, 但鉴于上面程序比较简单且测试并非本文主要讨论的东东, 所以略之。 注意, 上面libtest.a文件名是有要求的, 暂时不表。

 

 

       步骤三: 给客户提供libtest.a和test.h(二者缺一不可), 然后收钱, 收入为1毛。

 

        好了, 现在客户花了1毛钱买到了静态链接库和对应的头文件, 也就是ibtest.a和test.h, 那他怎么用呢?

        步骤一:

        先写应用程序main.c, 内容为:

 
  1. #include "test.h"  
  2.   
  3. int main()  
  4. {  
  5.     print();  
  6.     return 0;  
  7. }  

 

        步骤二: 支付1毛钱, 获取静态链接库libtest.a和test.h, 并用它们, 如下(我删除了除去main.c, libtest.a和test.h之外的所有东东):

  1. [taoge@localhost learn_c]$ ls  
  2. libtest.a  main.c  test.h  
  3. [taoge@localhost learn_c]$ gcc main.c -L. -ltest  
  4. [taoge@localhost learn_c]$ ./a.out   
  5. I am a little bit hungry now.  
  6. [taoge@localhost learn_c]$ rm libtest.a test.h   
  7. [taoge@localhost learn_c]$ ./a.out   
  8. I am a little bit hungry now.  
  9. [taoge@localhost learn_c]$   
        可以看到, 生成a.out后, 即使去掉了libtest.a和test.h, 也毫无关系, 因为这些都已经嵌入到a.out中了, 这就是所谓的静态链接库的作用。 那gcc如何查找静态库呢?当gcc看到-ltest的时候, 会自动去找去找libtest.a, 刚好, 我们有这个文件(对文件名有要求), 所以OK.   顺便说一下, 参数-L添加静态链接库文件搜索目录, 上面指定的是当前目录。

 

     

2、 动态库

仿照 上面的例子, 我们 可以用同样的 例子 来写一下 动态库的 生成 方式

   同样的文件 test.h  test.c

    编译共享库有两部分:

1、 编译成位置独立代码的目标文件  -fpic

2、 编译成共享库,选项 -shared

    · gcc -c  fpic test.c

. gcc -shared test.o -o  libtest.so

3、 使用一条指令的效果:

. gcc -fpic -shared  test.c -o libtest.so

4、 使用共享库:

 

/usr/lib   -- 一般作为用户库 存放路劲。

/usr/local/include ---存放头文件 位置  一般用 -I 参数指定 




 

(责任编辑:IT)