linux中动静态库的制作与发布,以及文件相关的三个属性

文章讲述了Linux系统中文件的Access、Modify和Change三个属性,强调了静态库和动态库的区别。静态库在编译时链接,运行时不再需要,而动态库在运行时动态链接,节省磁盘空间。制作静态库使用`ar`命令,动态库则需`gcc-fPIC-shared`选项。对于动态库的链接问题,可以通过设置`LD_LIBRARY_PATH`或修改`/etc/ld.so.conf.d`来解决。
摘要由CSDN通过智能技术生成

linux中动静态库的制作与发布,以及文件相关的三个属性

文件相关的三个属性

  • Access 文件最后的访问时间
  • Modify 文件内容最后的修改时间
  • Change 文件属性的最后修改时间
  1. 访问修改文件test.c,stat命令查看文件的详细属性信息

在这里插入图片描述
2. 可以看到修改文件内容时,有可能改变文件的属性,比如说文件的大小,因此,Modify和Change属性同时发生了更新。
3. 但是Access属性却没有更新,这是因为在比较新的linux内核中,Access时间不会立即进行更新,而是有一定的时间间隔再进行更新。文件的访问操作更加频繁,因此这种策略可以减少操作系统与磁盘的交互。
在这里插入图片描述
4. 可知make工具也会根据源文件和可执行程序的时间新旧关系,来判断是否需要重新编译源文件。

静态库与动态库

makefile的一些语法

在这里插入图片描述

在这里插入图片描述

静态库

  • 程序在编译链接时将库中代码链接到可执行文件中,程序运行时不在需要静态库,.a为后缀,例如/lib64/libc.a
  • ar -rc libmyku.a add.o sub.o 生成静态库
  • ar -rv libmyku.a 查看静态库的目录列表
    在这里插入图片描述
  • 注意库文件名有讲究,库文件的名字libxxxx.a 或者libxxxx.so
  • 所以库的真实名字去掉前缀lib,去掉后缀.a,.so,实际库名字为xxxx
    在这里插入图片描述
  • 使用静态库,gcc test.c -Ilib -Llib -lmyku。-I(大写的I)指定头文件的路径,-L指定库文件所在的路径,-l(小写的l)指定需要链接的库名字
  • 系统库头文件一般放在/lib64,/usr/lib,/usr/include等路径下,编译器可以根据这些默认路径去寻找相应的库和头文件,因此我们在用gcc,g++编译源文件时不需要手动指定系统、语言本身库以及头文件的路径。
  • Makefile自动构建库以及输出目录
    在这里插入图片描述

动态库

  • 程序在运行的时候才去链接动态库的代码,多个程序共享使用库的代码
  • 一个与动态库链接的可执行文件仅仅包含它用到的函数入口地址的一个表,而不是外部函数所在目标文件的整个机器码
  • 在可执行文件开始运行以前,外部函数的机器码由操作系统从磁盘上的该动态库中复制到内存中,这个过程成为动态链接。
  • 动态库可以在多个程序间共享,所以动态链接的可执行文件更小,节省了磁盘空间,操作系统采用虚拟内存机制允许物理内存中的一份动态库被要用到该库的所有进程共享。
  • makefile自动生成动态库以及输出目录
    在这里插入图片描述
  • gcc -fPIC -shared -o libdynamic.so add.c sub.c,-fPIC选项(产生位置无关码 position independent code)-shared选项(生成共享库格式)
  • gcc test.c -I./ouput -L./output -ldynamic,此时生成的可执行文件执行发生错误,虽然在编译时为编译器指定了头文件,库文件路径,以及具体需要链接的库名字。但是当程序执行时并不知道所依赖的动态库文件在哪里。。。
    在这里插入图片描述

解决办法

  1. 利用环境变量 export LD_LIBRARY_PATH=/home/…来指定链接库所在的路径
    在这里插入图片描述

  2. 将动态库文件所在路径写入系统的动态库加载配置文件,/etc/ld.so.conf.d/my_dynamic_ku.conf,ldconfig命令重新加载配置文件
    在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值