美文网首页
Head First C学习之动态库于静态库

Head First C学习之动态库于静态库

作者: 燚随风 | 来源:发表于2016-04-01 17:08 被阅读44次

    函数库分为静态库和动态库两种。

    静态库在程序编译时会被连接目标代码中,程序运行时将不再需要该静态库
    这类库的名字一般是libxxx.a
    动态库在程序编译时会被连接目标代码中,而是在程序运行是才被载入,因此在程序运行时还需要动态库存在。
    这类库的名字一般是libxxx.so

    静态库的创建

    一、#include <>代表标准头文件,

    只要头文件在标准目录中

    /usr/local/include //第三方库的头文件,编译器会先检查这个。 
    /usr/include            //操作系统的头文件
    

    二、#include ""为本地头文件编译程序

    三、共享.h都文件

    • 1、把头文件放到标准目录中。
    • 2、include语句中使用完整路径。
    • 3、用gcc -I选项指定头文件目录。

    四、nm命令

    nm命令.jpg

    五、ar存档命令

    ar命令.jpg
    • 所有.a文件都是libXXX.a形式命名的。
    • 存档是静态库(static library)。
    • .a文件保存在标准目录中。
    • 也可以放到自己的库目录中。
    • `ar -t<文件名>命令会列出存档中的目标文件。
    • ar -x<文件名.a> <文件名.o>会从存档中取出想要的目标文件。

    六、利用库文档编译其他程序

    gcc_ar.jpg

    如果使用的是自建的库;

    gcc test_code.c -L/my_lib -lhfsecurity -o test_code
    

    动态库的创建

    动态函数库所产生的可执行文件比较小。由于函数库没有被整合进你的程序,而是程序运行时动态的申请并调用,所以程序的运行环境中必须提供相应的库。动态函数库的改变并不影响你的程序,所以动态函数库的升级比较方便。
    都是由*.o目标文件生成。

    一、创建目标代码

    fPIC.jpg
    在创建hfcal.o时,多加了一盒标志-fPIC。它告诉gcc创建位子无关的代码。事实上大多系统不需要加这个选着。

    位置无关代码:计算机把它加载到存储器的哪个位置都可以运行的代码。

    二、不同平台的动态库

    • Windows中动态库通常叫动态链接库,后缀名是.dll
    • LinuxUnix上叫共享目标文件,后缀名.so
    • 而在MAC上,它们叫动态库,后缀名.dylib
    • 尽管后缀名不同,但是创建它们的方法相同。
      gcc-shared.jpg
      -shared选项告诉gcc你想把.o文件转化为动态库。
      假设在linux中创建一个叫libhfacl.so的库,,那么libgfcal.so就会记住它的苦命叫hfcal。
      注意:
    • 一旦用了某个名字编译了库,就不能载修改文件名了,若想从命名库,就必须用心的名字重新编译一次。
    • 一些老的MAC系统上没有-shared,可以用-dynamiclib代替。

    编译程序是实用的命令和静态存档是一样的。

    不同平台运行时,会有一些差异性,就是配置动态库的环境变量。

    相关文章

      网友评论

          本文标题:Head First C学习之动态库于静态库

          本文链接:https://www.haomeiwen.com/subject/jqeylttx.html