Linux静态库与动态库

来源:互联网 发布:电信网络客服电话 编辑:程序博客网 时间:2024/06/16 04:39
静态库(.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” (不是动态可执行文件) 

原创粉丝点击