硬链接
我们可以通过命令 ln myproc myproc-h 创建硬链接。
很容易发现 test(源文件) 和 mytest (硬链接)的文件大小是一样的,mytest的硬链接数从 1-> 2
通过 ls -i 文件名 我们还会发现,test 和 mytest-h的inode编号是一样的。
软链接
硬链接是通过inode引用另外一个文件,软链接是通过名字引用另外一个文件,我们可以通过以下命令创建一个文件的软连接
通过ls -i -l
命令我们可以看到,软链接文件的inode号与源文件的inode号是不同的,并且软链接文件的大小比源文件的大小要小得多。
总结:
软连接就好比windows下的快捷方式,当软件删除后,快捷方式就没用了,同理软连接在源文件删除后也无法使用,但硬链接文件大小和源文件是一样的,删除文件在某方面来说就是将硬链接数减少,彻底删除就是将硬链接数置为0。
acm
通过 stat 文件名 我们可以看到以下数据
下面解释一下文件的三个时间:
Access 最后访问时间
Modify 文件内容最后修改时间
Change 属性最后修改时间
静态库与动态库
认识动静态库
静态库(.a):程序在编译链接的时候把库的代码链接到可执行文件中。程序运行的时候将不再需要静态库
动态库(.so):程序在运行的时候才去链接动态库的代码,多个程序共享使用库的代码。
一个与动态库链接的可执行文件仅仅包含它用到的函数入口地址的一个表,而不是外部函数所在目标文件的整个机器码
在可执行文件开始运行以前,外部函数的机器码由操作系统从磁盘上的该动态库中复制到内存中,这个过程称为动态链接(dynamic linking)
动态库可以在多个程序间共享,所以动态链接使得可执行文件更小,节省了磁盘空间。操作系统采用虚 拟内存机制允许物理内存中的一份动态库被要用到该库的所有进程共用,节省了内存和磁盘空间。
动静态库的优点和缺点
静态库:
优点:使用静态库生成可执行程序后,该可执行程序就可以独自运行,不再需要库了。
缺点:使用静态库生成可执行程序会占用大量空间,特别是当有多个静态程序同时加载而这些静态程序使用的都是相同的库,这时在内存当中就会存在大量的重复代码。
动态库:
优点:节省磁盘空间,且多个用到相同动态库的程序同时运行时,库文件会通过进程地址空间进行共享,内存当中不会存在重复代码。
缺点:必须依赖动态库,否则无法运行
动静态库的生成
生成静态库
第一步:让所有源文件生成对应的目标文件;
第二步:使用ar命令将所有目标文件打包为静态库;
第三步:将头文件和生成的静态库组织起来
示例:
将下列文件打包成静态库
Date.h
#pragma once
#include<stdio.h>
extern void mydate(int x, int y);
Date.c
#include "Date.h"
void my_sub(int x, int y)
{
printf(" %d月 %d 日\n");
}
Log.h
#pragma once
#include <stdio.h>
extern void my_log(char*str);
Log.c
#include "Log.h"
void my_log(char*str)
{
printf("%s",str);
}
通过一个Makefile文件将他们组织起来
mylib=libcal.a
CC=gcc
$(mylib):Date.o Log.o
ar -rc -o $(mylib) $^
%.o:%.c
$(CC) -c $<
.PHONY:clean
clean:
rm -f $(mylib) ./*.o
.PHONY:output
output:
mkdir -p Datelib/include
mkdir -p Datelib/lib
cp ./*.h Datelib/include
cp ./*.a Datelib/include
生成动态库
动静态库的使用
动态库和静态库是两种常用的库文件形式,它们都是用于存储和管理可重用的代码的。下面我将分别介绍它们的使用。
使用动态库
1. 动态库在程序运行时被加载到内存中,多个程序可以共享同一个动态库的实例。
2. 创建动态库也需要两个步骤:编译和链接。和静态库不同的是,创建动态库时需要生成共享目标文件(.so 或 .dll)。
3. 在程序中使用动态库时,需要在编译阶段指定头文件的位置,然后在链接阶段指定库文件的位置和名称。同样,可以使用 `-l` 和 `-L` 选项来指定。
4. 动态库适合于大规模工程或需要动态加载和卸载的应用,因为它可以减小可执行文件的体积,并且可以在运行时替换和更新动态库。
2. 创建动态库也需要两个步骤:编译和链接。和静态库不同的是,创建动态库时需要生成共享目标文件(.so 或 .dll)。
3. 在程序中使用动态库时,需要在编译阶段指定头文件的位置,然后在链接阶段指定库文件的位置和名称。同样,可以使用 `-l` 和 `-L` 选项来指定。
4. 动态库适合于大规模工程或需要动态加载和卸载的应用,因为它可以减小可执行文件的体积,并且可以在运行时替换和更新动态库。
使用静态库
1. 静态库是在链接时被拷贝到可执行文件中的,因此可执行文件独立于静态库的存在。
2. 创建静态库需要两个步骤:编译和打包。首先,将源代码编译成目标文件(.o 或 .obj),然后将目标文件打包成静态库文件(.a 或 .lib)。
3. 在程序中使用静态库时,需要在编译和链接阶段指定库文件的位置和名称。可以使用 `-l` 编译选项指定库名,使用 `-L` 选项指定库文件的搜索路径。
4. 静态库适合于小规模工程或具有固定依赖关系的应用,因为每个可执行文件都包含了静态库的副本,可能会导致可执行文件体积较大。但是它也具有更好的兼容性和移植性。
2. 创建静态库需要两个步骤:编译和打包。首先,将源代码编译成目标文件(.o 或 .obj),然后将目标文件打包成静态库文件(.a 或 .lib)。
3. 在程序中使用静态库时,需要在编译和链接阶段指定库文件的位置和名称。可以使用 `-l` 编译选项指定库名,使用 `-L` 选项指定库文件的搜索路径。
4. 静态库适合于小规模工程或具有固定依赖关系的应用,因为每个可执行文件都包含了静态库的副本,可能会导致可执行文件体积较大。但是它也具有更好的兼容性和移植性。