文件相关的三个属性
- Access 文件最后的访问时间
- Modify 文件内容最后的修改时间
- Change 文件属性的最后修改时间
- 访问修改文件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,此时生成的可执行文件执行发生错误,虽然在编译时为编译器指定了头文件,库文件路径,以及具体需要链接的库名字。但是当程序执行时并不知道所依赖的动态库文件在哪里。。。
解决办法
-
利用环境变量 export LD_LIBRARY_PATH=/home/…来指定链接库所在的路径
-
将动态库文件所在路径写入系统的动态库加载配置文件,/etc/ld.so.conf.d/my_dynamic_ku.conf,ldconfig命令重新加载配置文件