1.文件的三个时间
Access: 访问时间,访问的频率很高,所以较新的Linux都是按一定的时间间隔刷新
Modify: 修改文件内容时间
Change:修改文件属性时间,修改文件内容也会修改文件属性
makefile自动编译判断文件是否为最新:就是按可执行程序和源代码文件的modify时间来判断的
2.动静态库
2.1.动静态库基础概念
在Linux中动态库的后缀.so,静态库的后缀.a;
file指令:查看可执行程序是动态还是静态链接
ldd指令:列出与动态库的依赖关系:list dynamic dependencies
2.2制作静态库
原理:把定义编译为可被链接的.o文件,再把这些文件打包在一起,当展开头文件被调用,再与对应的.o文件链接;
myadd.h
#pragma once
#include<stdio.h>
int Add(int a,int b);
myadd.c
#include"myadd.h"
int Add(int a,int b)
{
return a+b;
}
mysub.h
#pragma once
#include<stdio.h>
int Sub(int a,int b);
mysub.c
#include"mysub.h"
int Sub(int a,int b)
{
return a-b;
}
makefile
libmymath.a:mysub.o myadd.o//把.0文件使用ar -rc打包在一起
ar -rc $@ $^
%.o:%.c//把所有的.c文件编译为.o
gcc -c $<
.PHONY:clean
clean:
rm -rf *.o libmymath.a output
.PHONY:output//把头文件和库都放在一个目录下
output:
mkdir output
cp *.h output
cp libmymath.a output
2.2.1.如何使用制作的库呢?
写一段代码
#include"mysub.h"
#include"myadd.h"
int main()
{
int r1=Sub(5,1);
int r2=Add(5,1);
printf("r1=%d,r2=%d\n",r1,r2);
return 0;
}
这样生成可执行程序
2.3动态库的制作和使用
代码使用和静态库一样的代码
makefile
制作动态库使用 gcc -shared -o $@ $^
编译为.o文件要加一个fPIC
libmymath.so:mysub.o myadd.o//制作动态库使用 gcc -shared -o $@ $^
gcc -shared -o $@ $^
%.o:%.c//编译为.o文件要加一个fPIC
gcc -fPIC -c $<
.PHONY:clean
clean:
rm -rf *.o libmymath.so output_dynamic
.PHONY:output
output:
mkdir output_dynamic
cp *.h output_dynamic
cp libmymath.so output_dynamic
编译可执行程序还是一样
gcc test.c -I./output_dynamic -L./output_dynamic -lmymath -o test
但是不能执行
解决方法:LD_LIBRARY_PATH环境变量是加载器查找库的路径