关于Linux库文件的制作--普通的静态库、动态库

  本文章记录Linux库文件的制作--静态库和动态库

===========================================================

            静态库:

    静态库特点----优缺点:

  作个小比喻,我们需要看一本书,我们获得书的方法目前有两种,一、去书店买     二、去图书馆借

静态库就相当于去书店买.

  优点: 编译完,运行的时候不再需要链接库(直接运行)

  缺点:  1.编译完,二进制会变得很大...不运行时有点占用内存

       2.不利于库函数版本的维护(新书出了,还需要去书店重新买!!)

 

=============================================================

            动态库:

    动态库特点----优缺点:

  动态库相当于去书店借书

  缺点: 对于赖的人来说.......

  优点: 1.编译完,二进制变得不那么大,运行时自动链接库。

      2.利于库函数版本的维护(新书出了,不需要重新去书店买。因为程序运行时在链接“图书馆”)

 

#####################################################################

注意:
  以下静态库的名称是:show
  以下动态库的名称是:show

      操作过程:

  制作静态库:
   gcc  show_piano.c -o  show_piano.o   -c    (arm架构下运行的话要用交叉编译工具--   arm-none-linux-gnueabi-gcc)
   ar rcs libshow.a   *.o     (arm架构下运行的话要用交叉编译工具--   arm-none-linux-gnueabi-ar)

   见下图

==========================================================================
  制作动态库:
   gcc show_piano.c -o   show_piano.o  -c
   gcc -shared  -fPIC  -o  libyyy.so   *.o
  见下图

 

 

======================================================================

  X86下如何使用库文件(假设main.c中的代码用到了show_piano.o中的函数)
    gcc bmp.c -o bmp  -L  .  -lshow  (-L  .  是指该静态库位于当前路径)
      还有一个方法是: 将库文件copy到Linux库目录(不推荐这样做)

  然后直接  ./bmp  运行就okay
===============================================================================  

gcc bmp.c -o bmp -L  .  -lshow  (-L  .  是指该动态库位于当前路径)

 

运行之前需要做下面这个工作

如果不下心运行或库所在的路径改了...... 看下图

 

 

    如果静态库和动态库名字相同系统优先链接动态库

注意:
   链接静态库的程序,里面已经包含了完整的库代码,可以在任何时候,直接运行

   链接动态库的程序,不包含真正的库代码,只做了一些标记,运行的时候需要临时地找到动态库
   有如下方法,让程序可以找到动态库:
   A) 通过设置LD_LIBRARY_PATH环境变量,例如: export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:./lib   (推荐这么做)
   B) 将自定义的动态库丢到系统的标准库路径下(比如/lib),不推荐这样做,你会污染系统目录结构
   C) 直接修改系统标准库路径的默认值(即修改/etc/ld.so.conf.d/libc.conf),也不推荐这么做
   D) 如果不想在运行的时候,使用以上办法来让系统找到你的动态库,还可以提前在编译的时候加上这么一个选项:
      gcc bmp.c -o bmp  -L  somewhere/  -lxxx  -ldl  -Wl,-rpath=./somewhere/  告诉连接器,以后运行时库的路径。

                  (小写的 L) 


  ARM编译链接动态库
===============================================================
arm-none-linux-gnueabi-gcc XXX.c  -o XXX  -I    /home/ZZZ/YYY/include/    -L    /home/huang/YYY/lib   -lMMM

ZZZ 是指虚拟机用户名
XXX 是指.C文件名
YYY 是指家目录下安装了该动态库的里面有头文件和库文件的目录.
MMM 是指库名
-I (大写的 i ) 是指链接头文件
-L  是指链接库文件

 

posted @ 2017-03-06 18:19  得了白学症  阅读(254)  评论(0编辑  收藏  举报