静态库与动态库的创建和使用

库library

有时看着源代码裸奔,总觉得有点点羞羞。有没有办法给她套件衣服呢?

那件衣服就是 -> 高大上的(nei)库,想到哪去来。。。

------------华丽分割线---------

库:一个可供使用的各种标准程序、子程序、文件以及它们的目录等信息的有序集合!(百度百科)

看着晕,其实库就是那种 .lib .dll这些结尾的,它里面封装着许多函数的定义,只是他们已经变成对象文件 如:.o、.obj 。等着链接(link).链接就是把多个.o文件链成一个可执行文件。啊 ,跑偏了。

总之:库就是许多函数实现的对象文件的集合

 

库分为两种:静态库,动态库

静态库:在编译链接时就把库的代码提取出来加入可执行文件中,程序执行不在依赖库。

动态库:在编译链接时只记录了要用的名字(函数变量)在哪个库,运行时才从库找。

对比:静态库生成的可执行文件大,库升级后,必须重新产生可执行文件。
          动态库运行时慢,但库可以更新,原可执行文件不用在生成,代码可以重用。window系统很多地方用到动态库(就像.dll文件)

 

好了,接下来我们就自己制作自己的库把

静态库:
    1)产生库
        1.1.写程序(一般没main)

#include <stdio.h>
extern int a;
void welcome(const char*name)
{
    printf("welcome %s\n",name);
    
}

 

  
        1.2. gcc -c xxx1.c(产生xxx1.o文件)//xxx自己取名字
               gcc -c xxx2.c
        1.3. 再写个头文件xxx.h,里面放这些函数和全局变量的声明(extern int a)

 

  

#ifndef JING_LIB
#define JING_LIB
extern int a;
void welcome(const char*name);
#endif

 


        1.4.ar -r libxxx.a xxx1.o xxx2.o

  搞定


    2)使用库
        写个程序usexxx.c,包含头文件xxx.h,程序可以调用库中的函数或访问库中的全局变量,然后编译usexxx.c。最后链接usexxx.o和libxxx.a

    gcc -c usexxx.c(-c表示只编译)

    gcc usexxx.o libxxx.a(链接生成可执行文件)
 

2.动态库(共享库)libxxxx.so
    1).产生库
        1.1 写程序(一般没main)
    gcc -shared -o libxxx.so xxx1.c xxx2.c
    2).使用库
        2.1编译时:
            2.1.1编写usexxx.c
      gcc -c usexxx.c

      gcc usexx.o -lxxx -L

        2.2 运行时:   
    2.2.1设置环境变量LD_LIBRARY_PATH的值为动态库所在的目录

      export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:.

    2.2.2运行可执行文件
           
    3).更新库
        3.1 更新usexxx.c
          gcc -shared xxx1.c xxx2.c -o libxxx.so

  3.2 直接执行可执行文件

  

posted @ 2015-09-19 23:36  ChessChan  阅读(372)  评论(0编辑  收藏  举报