日志三个时间,动静态库的建立与使用

发布于:2022-10-28 ⋅ 阅读:(301) ⋅ 点赞:(0)

日志时间

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WLnwdrih-1666968472555)(./%E5%8A%A8%E9%9D%99%E6%80%81%E5%BA%93%E5%BB%BA%E7%AB%8B.assets/image-20221028153401112.png)]

Modify

  1. 最近修改文件内容的时间
  2. 在一定条件下,修改文件内容时,可能修改文件属性:文件大小属性改变了

Change

最近修改文件属性的时间

Access

  1. 文件最近访问的时间
  2. 访问文件的方式有很多种,如果每种访问都要记录,那么OS会非常忙碌,因此在最新的Linux内核中,Access时间不会立即更新,而是有一定时间间隔,OS会自动更新这个时间

make与g++

  1. makefileh和g++会根据时间问题,来判断源文件与可执行文件谁需要更新。
  2. 以时间为界限,make前.c文件的modify的时间是在可执行文件modify前的,一旦我们修改了.c文件,它的modify就在可执行文件的modify后面,Make就是通过这种方式判断文件是否更新。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8pD5KNt8-1666968472563)(./%E5%8A%A8%E9%9D%99%E6%80%81%E5%BA%93%E5%BB%BA%E7%AB%8B.assets/image-20221028154820975.png)]

  1. 库也是磁盘文件,也有它的inode,是一种二进制文件

  2. 一套完整的库:库文件本身,头文件,说明文档。

  3. 制作库:方便使用(声明定义分离),保护源码

  4. 一般库分为2种:动态库和静态库

  5. linux中 如果是动态库:以.so作为后缀;如果是静态库:以.a为后缀

  6. 库文件的命名:libxxx.so /libyy.a…

    库的真实名:去掉前缀lib,去掉.so/.a-…剩余的部分,也是就xxx和yy

  7. g++默认的编译方式是动态链接,如果想静态链接 加static[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BrYLl8Eq-1666968472566)(./%E5%8A%A8%E9%9D%99%E6%80%81%E5%BA%93%E5%BB%BA%E7%AB%8B.assets/image-20221028183509513.png)]。

ldd

  1. 显示一个文件使用的动态库
  2. 通过静态链接库因为拷贝是不显示的。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4ei7JHxz-1666968472568)(./%E5%8A%A8%E9%9D%99%E6%80%81%E5%BA%93%E5%BB%BA%E7%AB%8B.assets/image-20221028163104731.png)]

file

显示一个文件是动态链接还是静态链接

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-isbaCGkR-1666968472570)(./%E5%8A%A8%E9%9D%99%E6%80%81%E5%BA%93%E5%BB%BA%E7%AB%8B.assets/image-20221028163514279.png)]

静态库

  1. 静态库(.a):程序在编译链接的时候把库的代码链接到可执行文件中—静态链接。静态链接会导致文件非常大,但是程序运行的时候将不再需要静态库。

动态库

  1. 动态库(.so):程序在运行的时候才去链接动态库的代码,多个程序共享使用库的代码。

  2. 一个与动态库链接的可执行文件仅仅包含它用到的函数入口地址的一个表,而不是外部函数所在目标文件的整个机器码

  3. 在可执行文件开始运行以前,外部函数的机器码由操作系统从磁盘上的该动态库中复制到内存中,这个过程称为动态链接(dynamic linking )

  4. 动态库可以在多个程序间共享,所以动态链接使得可执行文件更小,节省了磁盘空间。操作系统采用虚拟内存机制允许物理内存中的一份动态库被要用到该库的所有进程共用,节省了内存和磁盘空间。

静态库

执行文件的形成需要目标文件(.o),因此如果我们只提高目标文件和库文件,会有效的保护源码

静态的制作

  1. 通过ar指令,实现归档
ar -rc  

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2fwfI1oX-1666968472572)(./%E5%8A%A8%E9%9D%99%E6%80%81%E5%BA%93%E5%BB%BA%E7%AB%8B.assets/image-20221028201023553-1666959024607-1.png)]

  1. 通过 ar -tv 显示库中的内容

    ar -tv
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rhXiaM7g-1666968472573)(./%E5%8A%A8%E9%9D%99%E6%80%81%E5%BA%93%E5%BB%BA%E7%AB%8B.assets/image-20221028202006185-1666959607266-3.png)]

静态库的使用

   g++ -o $@ $^ -Ixx -Lyy -l zz

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-93z9kGWq-1666968472574)(./%E5%8A%A8%E9%9D%99%E6%80%81%E5%BA%93%E5%BB%BA%E7%AB%8B.assets/image-20221028212250187.png)]

在这里插入图片描述

动态库

动态库的制作

 g++  -shared -o $@ $^
  g++ -fPIC -c $<

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-E5HGymTl-1666968472576)(./%E5%8A%A8%E9%9D%99%E6%80%81%E5%BA%93%E5%BB%BA%E7%AB%8B.assets/image-20221028215428271.png)]

动态库的使用

g++ -o $@ $^ -I./lib -L./lib -lmymath
  1. 动态链接的特性,导致编译器的编译和加载器的启动都需要确定动态库的路径,且二者存放路径的地方是不同的。

  2. 编译器在编译的时候就可以显示的告知,加载器需要在LD_LIBRARY_PATH中添加路径,不过这是一次性的,一旦该bash死亡就没有了

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QpGsBDZj-1666968472577)(./%E5%8A%A8%E9%9D%99%E6%80%81%E5%BA%93%E5%BB%BA%E7%AB%8B.assets/image-20221028223232869.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fCEYHH1J-1666968472578)(./%E5%8A%A8%E9%9D%99%E6%80%81%E5%BA%93%E5%BB%BA%E7%AB%8B.assets/image-20221028223307867.png)]

  1. 长久加载器生效

在/etc/ld.so.conf.d/bit.conf添加库路径

最后ldconfig刷新一下

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-U4lAwGQG-1666968472579)(./%E5%8A%A8%E9%9D%99%E6%80%81%E5%BA%93%E5%BB%BA%E7%AB%8B.assets/image-20221028224724873.png)]