Linux 静态库与共享库

可以把 多个编译好的目标文件 打包成为一个文件,就是库文件。库文件有两种:静态库(.a)和共享库(.so)。

静态库和共享库区别:
    静态库是 函数的归档,在使用时,复制函数的代码区到最终的文件中。
    共享库是 函数的归档,在使用时,把函数在共享库中的地址拿到最终的文件中。
    静态库的效率稍高一点,但占用空间非常大,而且不利于修改和维护。
    共享库的效率稍低一点,但占用空间小,而且修改和维护方便。

一、静态库的创建和使用

1、创建静态库文件(.a)

    (1 )写源代码 add.c,保存退出。 
    (2 )编译源程序 add.c,生成目标文件 add.o 。
      gcc -c -static add.c

      其中-static 可选,可阻止gcc使用共享库。
    ( 3)打包生成 静态库文件(.a)
      ar -r 静态库文件名 add.o 
      静态库文件名命名规范: lib库名.a
      比如:ar -r mystaticlib.a add.o

      ar指令:

      ar [选项]    归档文件名  目标文件列表

      指令ar的常用选项

       -d   从归档文件删除指定目标文件列表

       -q   从指定目标文件快速附加到归档文件末尾

       -r    将指定目标文件插入文档,如果存在则更新

       -t     显示目标文件列表

       -x   把归档文件展开为目标文件

2、使用静态库:

    1 写程序test.c,保存退出。
    2 编译test.c,生成目标文件test.o。
      gcc -c test.c
    3 连接库文件的方式:
      a   直接连接   gcc test.o mystaticlib.a
      b   配置环境变量LIBRARY_PATH,把库文件所在路径加入,运行 gcc test.o -l myku 即可(库名)。
      c   gcc test.o -l myku -L 库所在路径
    注:静态库文件在使用时,必须提供 .h文件。

二、共享库的创建和使用:

 1、  共享库的创建(.so) 

    ( 1 )写源程序 add.c,保存退出。
    (2 )编译源程序,生成目标文件(add.o)。
          gcc -c -fpic add.c (-fpic省略也行)
    (3 )生成共享库文件。
          gcc -shared add.o -o libmyku.so
      共享库文件的命名规范: lib库名.so

 2、  共享库的使用:

     使用方式和静态库一样。
  注:静态库使用函数时复制代码段,因此静态库在执行时,可执行文件中包含了所有的代码,a.out不再需要静态库。
   共享库使用函数时只是留下了函数地址,因此共享库在执行时,可执行文件中只有地址而没有代码,a.out需要在共享库中执行相关函数的代码。环境变量LD_LIBRARY_PATH可以帮助a.out找到共享库。
   ldd 可执行文件/库文件名 - 可以查看库文件的关系


三、动态调用共享库

    #include <dlfcn.h>
    void *dlopen(const char *filename, int flag);
     打开库文件,filename是带路径的文件名,flag可以为
    RTLD_LAZY: 延迟加载(用的时候再把库文件加载到内存)
    RTLD_NOW: 马上加载
    void *dlsym(void *handle, const char *symbol);
    用函数名 从打开的库文件中获取一个函数。
    int dlclose(void *handle);
    关闭库文件。
    char *dlerror(void); //查看是否出错。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值