zoukankan      html  css  js  c++  java
  • 动态库与静态库

    简介

    (1)静态库的特征
           1)静态库在使用时,直接把代码复制到目标文件中。
           2)优点:不需要跳转,效率比较好,脱离静态库文件。
           3)缺点:目标文件会比较大,修改和维护都不太方便。
     
    (2)共享库的特征
           1)共享库在使用时,直接把点吗所对应的地址复制过来。
           2)优点:目标文件比较小,修改和维护都方便。
           3)缺点:需要跳转,效率比较低,不能脱离共享库文件。

    静态库

    静态库概念

    1.库是预编译的目标文件(object files)的集合,它们可以被链接进程序。静态库以后缀为”.a”的特殊的存档(archive file)存储。

    2.标准系统库可在目录/usr/lib与/lib中找到。比如,在类Unix系统中C语言的数序库一般存储为文件/usr/lib/libm.a。该库中函数的原型声明在头文件/usr/include/math.h中。

    3.C标准库本身存储为/usr/lib/libc.a,它包含ANS1/ISO标准指定的函数,比如printf。对每一个C程序来说,libc.a都默认被链接。

    4.一个事例:
    在tiger.c程序中调用一个数学库libm.a中sin函数。

    #include<stdio.h>
    #include<math.h>
    int  main()
    {
             double  x = 2.0;
             double y = sin(x);
             printf(“the result:%f
    ”,y);
             return 0;
    }
    

    如果直接使用gcc tiger.c则会出现错误:

    undefined  reference to ‘sin’;
    

    1>函数sin(),未在本程序中定义也不在默认库’libc.a’中,除非被指定,编译器也不会链接’libm.a’。

    2>为使编译器能将sin()链接进主程序‘test.c’,需要提供数学库’libm.a’.。

    3>使用方法:

    gcc  tiger.c /usr/lib/libm.a  -o tiger
    

    则可以编译通过。为了避免在命令行中指定长的路径,编译器为链接函数库提供了快捷的选项“-l”。因此可以使用下面的方法:

    gcc  tiger.c -lm –o tiger
    

    注:选项-lNAME使用连接器尝试链接系统库目录中的函数库文件libNAME.a。

    生成和使用静态库

    1.静态库是obj文件的一个集合,通常静态库以”.a”为后缀。静态库由程序ar生成。

    2.静态库的优点是可以在不用重新编译程序库代码的情况下,进行程序的重新链接,这种方法节省了编译过程的时间(在编译大型程序的时候,需要花费很长的时间)。静态库的另一个优点是开发者可以提供库文件给使用的人员,不用开放源代码,这是库函数提供者经常采用的手段。

    3.通过一个实例来了解如何自己生成静态库和使用静态库

    生成静态库

    1>在test文件夹下有三个文件:main.c ,tiger.c,tiger.h;

    a. main.c文件中的内容:

    #include<stdio.h>
    #include”tiger.h”     //注意include该文件,并不是仅链入.a文件即可
    int  main(void)
    {
           printf(“sum=%d
    ”,add(3,5));
           return 0;       
    }
    

    b.tiger.h文件中的内容:

    #ifndef __TIGER__
    #define __TIGER__
    
    int  add(int  a,int b);
    
    #endif
    

    c.tiger.c文件中的内容

    int  add(int  a,int b)
    {
            return a+b;
    }
    

    2>创建静态库的最基本步骤是生成目标文件tiger.o

    gcc  -o tiger.o  -c  tiger.c
    

    3>然后生成静态库libadd.a:

    ar  -rcs libadd.a  tiger.o    
    

    使用静态库

    1>使用gcc命令带上库文件就OK了

    gcc  -o  main main.c  libadd.a
    

    2> 也可以使用命令”-l库名”进行,库名是不包含库函数库和扩展名的字符串。

    gcc  -o  main  main.c -ladd
    

    上面的命令执行完后,系统返回:

    Cannot  find –ladd
    

    说明:上面的命令将在系统默认的路径去查找add函数库,并把他链接到要生成的目标程序上。系统提示没有找到库文件add,这是由于add库函数没有在系统默认的查找路径下,我们需要认为指定库函数的路径,例如:库文件和当前编译文件在同一目录下:

    gcc  -o main  main.c -L  ./  -ladd
    

    系统就能正常生成可执行文件。

    说明:

    在使用-l选项时,-o选项的目的名要在-l链接的库名之前,否则gcc会认为-l是生成的目标而出错。

    参考链接:
    https://www.cnblogs.com/zzdbullet/p/10150323.html

  • 相关阅读:
    Java基础12-继承(思想、覆盖、super,子类初始化)
    Java基础11-封装(思想、访问权限、this、构造方法)
    Java基础10-方法的重载与递归
    Java基础9-java的类、对象和方法
    Java基础8-浅谈java程序的运行机制与JVM运行
    Java基础7-数组
    Java基础6-控制语句
    Java基础5-运算符
    python socket编程基础
    python 之 异常处理
  • 原文地址:https://www.cnblogs.com/chendeqiang/p/14312136.html
Copyright © 2011-2022 走看看