静态库与动态库总结(Linux平台)

一、静态库的编译

1.编译过程(*.a(静态库扩展名)   achieve)

  1.1.编译成目标文件

    -static  可选

    gcc -c -static 代码文件.c

           -c  只编译不连接

  1.2.归档成静态库(专门工具arnm

    ar工具

    ar -r

           -t (-p -x -m -q 不常用)

    ar -r 静态库文件  被归档的文件(创建静态库)

    #ar -r  ku.a  ku1.o ku2.o

                  #ar -t  ku.a 

    nm工具(查看函数符号表) #nm ku.a 

    nm 静态库或者动态库或者目标文件或者执行文件

 1.3.使用静态库

    gcc 文件代码  静态库  -o 文件 

                   (把静态库作为代码的一部分来编译)

        总结:

        1.什么是库?(文件的封装或归档)

            函数等代码封装的二进制已经编译的归档文件

        2.ar归档工具

        3.采用库的方式管理代码优点

            容易组织代码

            复用

            保护代码版权(如将算法程序编译成静态库提供给用户)

        4.静态库的静态的含义:

            编译好的程序运行的时候不依赖库。

           库作为程序的一部分编译连接。

        5.静态库的本质:

            就是目标文件集合(归档)

        6.-static可选

 2.库的规范与约定

    库命名规则:

    lib库名.a.主版本号.副版本号.批号

    lib库名.a

      #ar -r  libku.a  ku1.o  ku2.o

                    库的使用规则:

                    -l 库名(空格可省)

                    -L 库所在目录           #gcc main.c -o main -l ku -L .  (系统自动加上lib,自动搜索.a .so后缀)

二、动态库的编译 (库就是封装)

1.什么是动态库?(Linux系统称共享库)

    动态库是可以执行,静态库不能执行

    但动态库没有main,不能独立执行。

    动态库不会连接成程序的一部分。

    程序执行的时候,必须需要动态库文件。

2.工具

    ldd  察看程序需要调用的动态库

    ldd 只能察看可执行文件.(ELF执行连接格式

    readelf -h 察看执行程序头部信息.

    nm      察看库(动态库和静态库)中的函数符号

3.动态库的编译

    3.1.编译  position independent code(位置无关代码)

        -c -fpic(可选)

    3.2.连接

            -shared

               (编译时只能一个代码一个个编译,连接可以连接多个)

                 #gcc -c -fpic iotool.c      #gcc -c -fpic grapic.c

                 #gcc -shared -o libdemo4.so iotool.o graphic.o

4.使用动态库 (库名不含lib  .a  .so)

        gcc 代码   动态库文件名 

        gcc 代码   -l库名 -L动态库所在路径 (标准形式)

         (编译后的可执行文件不一定能运行,所加载的动态库需要加载到内存空间)

    标准命名规则

     lib库名.so

     lib库名.a

        -l 库名  -L 库所在路径

    
    问题:

    4.1.执行程序怎么加载动态库?

    4.2.动态库没有作为执行程序的一部分,为什么连接需要指定动态库以及目录?

    连接器需要确定函数在动态库的中的位置

   
 动态库的加载

    1.找到动态库(用户指定查找目录)

    2.加载动态库到内存

    3.映射到用户的内存空间 (后两项由系统操作)

    系统对动态库查找规则:windows/system32/

                    /lib    /usr/lib

    到环境变量LD_LIBRARY_PATH指定的路径中查找

    缓冲机制:(不是一个个找,而是启动时加载到缓冲)

        把/lib:/usr/lib:LD_LIBRARY_PATH加载到缓冲。

        /sbin/ldconfig -v 刷新缓冲中动态库.so的搜索路径。

       #export  LD_LIBRARY_PATH=.:..:~LFH

你可能感兴趣的:(Linux系统)