• Linux软硬连接与动静态库


    硬链接

    我们可以通过命令 ln myproc myproc-h  创建硬链接。
    23abb2b89de343ceab86d66765a11108.png
    很容易发现 test(源文件) 和 mytest (硬链接)的文件大小是一样的,mytest的硬链接数从 1-> 2
    97e4cf4d6ac74353aa6db95016924329.png

    通过 ls -i 文件名 我们还会发现,test 和 mytest-h的inode编号是一样的。

    f90c27eb8f1f4634825c4b205bdf17d8.png

    软链接

    硬链接是通过inode引用另外一个文件,软链接是通过名字引用另外一个文件,我们可以通过以下命令创建一个文件的软连接
    aa1f187442104ede812625930f1dfe71.png

    通过ls -i -l命令我们可以看到,软链接文件的inode号与源文件的inode号是不同的,并且软链接文件的大小比源文件的大小要小得多。

    8fabb7a749484521805240cfecbd6ef7.png

    总结:

    软连接就好比windows下的快捷方式,当软件删除后,快捷方式就没用了,同理软连接在源文件删除后也无法使用,但硬链接文件大小和源文件是一样的,删除文件在某方面来说就是将硬链接数减少,彻底删除就是将硬链接数置为0。

    acm

    通过 stat 文件名 我们可以看到以下数据
    7030a66e578f47968d485d8bcfbaa180.png
    下面解释一下文件的三个时间:
                    Access 最后访问时间
                    Modify 文件内容最后修改时间
                    Change 属性最后修改时间
     

    静态库与动态库

     认识动静态库

     静态库(.a):程序在编译链接的时候把库的代码链接到可执行文件中。程序运行的时候将不再需要静态库
    动态库(.so):程序在运行的时候才去链接动态库的代码,多个程序共享使用库的代码。
    一个与动态库链接的可执行文件仅仅包含它用到的函数入口地址的一个表,而不是外部函数所在目标文件的整个机器码
    在可执行文件开始运行以前,外部函数的机器码由操作系统从磁盘上的该动态库中复制到内存中,这个过程称为动态链接(dynamic linking)
    动态库可以在多个程序间共享,所以动态链接使得可执行文件更小,节省了磁盘空间。操作系统采用虚 拟内存机制允许物理内存中的一份动态库被要用到该库的所有进程共用,节省了内存和磁盘空间。

    动静态库的优点和缺点

    静态库:

    优点:使用静态库生成可执行程序后,该可执行程序就可以独自运行,不再需要库了。

    缺点:使用静态库生成可执行程序会占用大量空间,特别是当有多个静态程序同时加载而这些静态程序使用的都是相同的库,这时在内存当中就会存在大量的重复代码。

    动态库:

    优点:节省磁盘空间,且多个用到相同动态库的程序同时运行时,库文件会通过进程地址空间进行共享,内存当中不会存在重复代码。

    缺点:必须依赖动态库,否则无法运行

    动静态库的生成

    生成静态库

     第一步:让所有源文件生成对应的目标文件;
    第二步:使用ar命令将所有目标文件打包为静态库;
    第三步:将头文件和生成的静态库组织起来
    示例:
    将下列文件打包成静态库
    e67136d3f2644c37984b72a5adaa07fb.png
    Date.h
    1. #pragma once
    2. #include
    3. extern void mydate(int x, int y);

    Date.c

    1. #include "Date.h"
    2. void my_sub(int x, int y)
    3. {
    4. printf(" %d月 %d 日\n");
    5. }
    Log.h
    1. #pragma once
    2. #include
    3. extern void my_log(char*str);
    Log.c
    1. #include "Log.h"
    2. void my_log(char*str)
    3. {
    4. printf("%s",str);
    5. }
    通过一个Makefile文件将他们组织起来
    1. mylib=libcal.a
    2. CC=gcc
    3. $(mylib):Date.o Log.o
    4. ar -rc -o $(mylib) $^
    5. %.o:%.c
    6. $(CC) -c $<
    7. .PHONY:clean
    8. clean:
    9. rm -f $(mylib) ./*.o
    10. .PHONY:output
    11. output:
    12. mkdir -p Datelib/include
    13. mkdir -p Datelib/lib
    14. cp ./*.h Datelib/include
    15. cp ./*.a Datelib/include

    75f2f7ad637f4661baa18f7fb3d8618a.png

    生成动态库

    动静态库的使用

    动态库和静态库是两种常用的库文件形式,它们都是用于存储和管理可重用的代码的。下面我将分别介绍它们的使用。

    使用动态库
    1. 动态库在程序运行时被加载到内存中,多个程序可以共享同一个动态库的实例。
    2. 创建动态库也需要两个步骤:编译和链接。和静态库不同的是,创建动态库时需要生成共享目标文件(.so 或 .dll)。
    3. 在程序中使用动态库时,需要在编译阶段指定头文件的位置,然后在链接阶段指定库文件的位置和名称。同样,可以使用 `-l` 和 `-L` 选项来指定。
    4. 动态库适合于大规模工程或需要动态加载和卸载的应用,因为它可以减小可执行文件的体积,并且可以在运行时替换和更新动态库。
    使用静态库
    1. 静态库是在链接时被拷贝到可执行文件中的,因此可执行文件独立于静态库的存在。
    2. 创建静态库需要两个步骤:编译和打包。首先,将源代码编译成目标文件(.o 或 .obj),然后将目标文件打包成静态库文件(.a 或 .lib)。
    3. 在程序中使用静态库时,需要在编译和链接阶段指定库文件的位置和名称。可以使用 `-l` 编译选项指定库名,使用 `-L` 选项指定库文件的搜索路径。
    4. 静态库适合于小规模工程或具有固定依赖关系的应用,因为每个可执行文件都包含了静态库的副本,可能会导致可执行文件体积较大。但是它也具有更好的兼容性和移植性
     

     

  • 相关阅读:
    排序算法-----希尔排序
    岭回归和LASSO回归
    23.项目开发之量化交易抓取数据QuantTradeData(二)
    猿创征文|软件测试入门(一)
    软考 系统架构设计师系列知识点之大数据(1)
    交换机和路由器技术-19-HSRP和PVSTP综合实验
    【shell】条件语句
    阿里云全球故障凸显“云集中”风险
    linux pinctrl子系统
    什么是域名解析?如何进行域名解析设置?
  • 原文地址:https://blog.csdn.net/qq_59293418/article/details/132699539