Linux静态库与动态库

静态库(.a):
   静态库的代码在编译过程中已经被载入可执行程序,因此体积较大。
        编译程序时候需要库作依赖,运行时候不需要。(方便,不再需要外部函数库支持)
缺点:
         1、因为静态库被链接后直接嵌入可执行程序中,相当于每一个可执行程序里都有一个库的副本,浪费空间;
         2、一旦库中有bug,需要重新编译。
创建步骤:
         1、编写函数接口(.c)
               vim file1.c .......
             vim file2.c .......
         2、 编译成.o文件
               gcc -o file1.o -c file1.c 
            gcc -o file2.o -c file2.c 
          3、打包成库(库名称以lib开头)
               ar -crs libmy.a file1.o file2.o
          4、静态库使用( 编译程序
               gcc -o main main.c -L. -lmy
          5、直接运行
动态库(.so):
   共享库的代码是在可执行程序运行时才载入内存的,在编译过程中仅简单的引用,因此代码体积较小。
        编译和运行程序都要有库作依赖。
创建步骤:
         1、编写函数接口(.c)
               vim file1.c .......
             vim file2.c . ......
         2、 编译成.o文件
               -fPIC:表示生成位置无关代码(Position Independent Code)
               gcc   -fPIC   -o file1.o -c file1.c 
            gcc  -fPIC  -o file2.o -c file2.c 
          3、打包成库(库名称以lib开头)
               gcc -shared -fPIC -o libmy.so file1.o file2.o
          4、静态库使用( 编译程序
               gcc -o main main.c -L. -lmy
           5、
设置lib环境变量 
             export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:库存放的路径
                export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/mnt/hgfs/76期/系统编程/005/code/sharedlib
                
              直接把动态库文件拷贝到/lib或/usr/lib目录下
              在/etc/ld.so.conf文件里加入我们生成的库的目录,然后/sbin/ldconfig
                   关于/etc/ld.so.conf:
                   里面存放的是链接器和加载器搜索共享库时要检查的目录,默认是从/usr/lib /lib中读取的,所以想要顺利运行,我们也可以把我们库的目录加入到这个文件中并执行/sbin/ldconfig 

        6、运行
查看库依赖(ldd):  
          ldd    文件
             看动态库,如果目标程序没有链接动态库,则打印“not a dynamic executable” (不是动态可执行文件) 

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页