静态库和共享库-Linux/Unix

1 静态库
          静态库就是目标文件的集合,以.a结尾。静态库在程序链接的时候使用,链接器会将程序中使用到的函数的代码从
  库文件中拷贝到应用程序中去(a.out)。一旦链接完成,那么在执行程序时就不需要该静态库了。由于每个使用静
  态库的应用程序(a.out)都需要拷贝所用函数的代码,所以静态链接的文件会比较大。
  1.1 静态库的创建
       1)编辑.c和.h文件
       2)编译生产目标文件:gcc -c xxx.c -o xxx.o
                                             gcc -c yyy.c -o yyy.o
                                              ...
       3)打包成静态库文件:ar -r libxxxxxxxxx.a xxx.o yyy.o
                                              -r:将目标文件插入到静态库中,已存在则更新
  1.2 静态库的使用
      1)直接法
                        gcc xxx.c libxxxxx.a
      2)环境变量法
                        export LIBRARY_PATH=.:$LIBRARY_PATH
                        (声明定义) 环境变量的名称=.:原有值(取原有值只要在变量的前面加一个$符号)
                        gcc xxx.c -lxxxxx
      3)参数法
                        gcc main.c -lmy -L./
 
2 共享库
          共享库在程序链接时,并不像静态库那样拷贝使用函数的代码,而只是做一些标记,然后在程序启动的时,动态加载所
  需要的共享库。所以当应用程序运行时,任然需要共享库的支持。共享库链接出来的a.out要比静态库链接出来的a.out
  要小。
  2.1 共享库的创建
     1)编辑.c .h
     2)编译生成目标文件 gcc -c -fpic xxx.c -o xxx.o
                                        gcc -c -fpic yyy.c -o yyy.o
                                         ......
     3)链接生产共享库文件 gcc -shared xxx.o yyy.o -o libxxxx.so
                                            gcc -shared -fpic xxx.c yyy.c -o libxxxx.so
  2.2使用共享库
     1)直接法
                      gcc xxx.c libxxxxx.so
     2)环境变量法
                      export LIBRARY_PATH=.:$LIBRARY_PATH
                      (声明定义) 环境变量的名称=.:原有值(取原有值只要在变量的前面加一个$符号)
                      gcc xxx.c -lxxxxx
     3)参数法(推荐)
                      gcc main.c -lmy -L./
  2.3 运行
                      export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH
                      LD_LIBRARY_PATH:指定共享库加载目录

  【总结】静态库占用的空间大,不易修改,但执行效率高
                共享库占用的空间小,易于修改,但执行效率低
  
    需要使用的命令:
        ar:打包
        nm:可以查看目标文件(.o)、可执行文件(a.out)、静态库文件(.a)、共享库文件(.so),他们中的所有的符号
        ldd:可以用来查看可执行文件(a.out)和共享库文件(.so)的动态依赖
        objdump:显示二进制模块的汇编信息(查看代码的执行效率)

发布了22 篇原创文章 · 获赞 0 · 访问量 4610
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章