Linux中的动态库静态库

linux.调用so
#include <dlfcn.h>
main()
{
 void *handle=dlopen("./libdemo4.so",RTLD_LAZY);
 void(*fun)(int)=dlsym(handle,"diamond");
 fun(5);
 dlclose(handle);}


使用libdl.so库
  动态库加载的原理            
  
  动态库中函数的查找已经封装成库libdl.so
  dlopen  打开一个动态库
  dlsym  在打开动态库找一个函数
  dlclose 关闭动态库
  //dlerror 返回错误
  译
   1.什么是动态库?(共享库)
     动态库是可以执行,静态库不能执行
     但动态库没有main,不能独立执行。
     动态库不会连接成程序的一部分。
     程序执行的时候,必须需要动态库文件。
   2.工具
     ldd  察看程序需要调用的动态库
       ldd 只能察看可执行文件.
     readelf -h 察看执行程序头.
     nm   察看库中的函数符号
   3.动态库的编译
     3.1.编译
       -c -fpic(可选)
     3.2.连接
       -shared
   4.使用动态库
     gcc 代码 动态库文件名 
     gcc 代码   -l库名 -L动态库所在路径
     
   标准命名规则:
     lib库名.so
     lib库名.a
     
     -l 库名  -L 库所在路径
       
   问题:
     4.1.执行程序怎么加载动态库?
     4.2.动态库没有作为执行程序的一部分,为什么连接需要指定动态库以及目录?
       连接器需要确定函数在动态库的中的位置
       
   动态库的加载:
     1.找到动态库
     2.加载动态库到内存
     3.映射到用户的内存空间
   系统对动态库查找规则:
     /lib
     /usr/lib
     到环境变量LD_LIBRARY_PATH指定的路径中查找
       


三.静态库的编译
  1.编译过程(*.a   achieve)
   1.1.编译成目标文件
     -static  可选
     gcc -c -static 代码文件.c
     
   1.2.归档成静态库
     ar工具
       ar -r
         -t
      ar -r 静态库文件  被归档的文件  
      
     nm工具(察看函数符号表)
      nm 静态库或者动态库或者目标文件或者执行文件
   1.3.使用静态库
     gcc 代码  静态库    
 总结:
    1.什么是库?
      函数等代码封装的二进制已经编译的归档文件
    2.ar归档工具
    3.采用库德方式管理代码优点:
      容易组织代码
      复用
      保护代码版权
    4.静态库的静态的含义:
      编译好的程序运行的时候不依赖库。
      库作为程序的一部分编译连接。
    5.静态库本质:
      就是目标文件集合(归档)
    6.-static可选
    
   2.库的规范与约定        
     库命名规则:
       lib库名.a.主版本号.副版本号.批号
       lib库名.a
     库使用规则
       -l 库名
       -L 库所在目录  

 我们在写c语言的时候,经常会去包含一个.h的头文件,这个头文件就是库文件,比如<stdio.h>,<stdlib.h>这些都是标准的头文件,一般放在/usr/include,也就是说,从这个目录中我们可以找到这个头文件,然后调用它的库里面的方法,当然这些库是gcc帮助我们自动链接的,那么这里就延伸出了一个问题,不在标准库里面的头文件,我们怎么引用,也就是我们自己的头文件怎么引用?,

介绍头文件的用法

什么是静态库与动态库

 静态库与动态库的制作方法

静态库的制作

在这里插入图片描述

 静态库的使用

主函数c文件 -l库名 -L 路径 -o 可执行文件名
-l是要指定要用的静态库
-L告诉gcc编译器从-L指定的路径去找静态库,默认从 /usr/lib 或 /usr/local/lib 路径下去找。

在这里插入图片描述

动态库的制作

 动态库的使用

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 #include "add.h"
  4 
  5 
  6 int main()
  7 {
  8         int res = add(1,2);
  9         printf("%d\n",res);
 10         return 0;
 11 }

 ldd->可以查看可执行文件的可依赖的库文件

 

 

 

linux之静态库与动态库_悟空不买菜了的博客-CSDN博客_linux静态库和动态库

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值