一、库文件:
1.定义: 库文件指事先将写好的预编译指令封装成库,在使用某些功能时就不需要重新写入,调用库文件就行。为用户提供调 用接口。
2.分类:库文件可分为静态库和动态库。在window下,静态库的扩展名为.lib文件,动态库(共享库)为.DDL文件;Linux下静态库文件扩展名为.a,动态库文件的扩展名为.so文件。
3.静态库
- 特点:程序在链接时,链接器在库文件获取需要的代码,复制到生成的文件中。所以在程序链接阶段被复制到程序中,和程序的执行过程没有关系。
- 创建步骤:
eg: 有两个源文件为main.c和test.c文件
gcc -c main.c test.c ——>main.o test.o 使用ar将目标文件归档:ar crv libname.c main.o test.o
libname.a为创建的静态库。
- linux下 使用命令:gcc -o main main.c -L库的存储路径 -l库文件名称
4.动态库
- 特点:动态库在连接阶段并未加载到程序中,而是程序在运行时被系统动态加载到内存中使用。
- 创建步骤:
eg:有源文件main.c
gcc -fPIC -shared -o libname.so main.c //这行代码可以分两步执行: gcc -c -fPIC main.c gcc-shared -o libname.so main.c
libname.so为创建的动态库
- linux下使用命令:gcc -o main main.c -L库的存储路径 -l库文件名称
- 在linux下可通过LD_LIBRARY_PATH环境变量给操作系统指定库加载路径
1.可直接在终端上改 export LD_LIBRARY_PAT=库的路径;
2.修改配置文件 /etc LD_LIBRARY_PAT=库的路径;
3.将生成文件的共享库存储到系统默认的搜索路径下 /lib /usr/lib
5.linux下库的生成:
6.动态库与静态库的区别
- 静态库链接过程中拷贝了一份库文件代码,而动态库是在系统运行时将库文件代码加载到内存中。如果多次使用静态库文件, 就会拷贝多次,占用内存,浪费空间; 动态库只需加载一次,不同程序可以得到内存中相同动态库文件的副本,节省内存。
- 程序运行时不需要依赖静态库,但动态库恰恰相反
- 静态库类似于中间文件的集合,是不可执行的;共享库是一个不可执行文件;
- 在更新库的功能时,如若是静态库,必须重新编译可执行文件;动态库只需更新共享库就行。
二、Makefile文件
1.makefile主要包括显示规则、隐晦规则、变量定义、文件指示和指示五个方面的内容。
2. 定义:系统规则,哪些文件需要先编译、后编译或重新编译。
3.优点:提高了软件编译效率;提高开发人员的工作效率;make一次写好,永久使用。
4. 功能:这个事关工程的编译规则,执行操作系统的命令。实现自动化编译,提高编译效率(只会编译修改的和依赖于修改的 文件)
5.工作原理:make是解释Make file 的指令工具;当我们输入make时:
- make首先会在当前目录下找Makefile文件;
- 如果找到,他会选择文件中的一个目标文件main,并把main文件作为最终目标文件;
- 如果main文件不存在或main后面依赖的.o文件的修改时间要比main文件新,那他会执行后面所定义的命令生成main文 件;
- 如果main 依赖的.o文件存在,make会在当前文件中找目标为.o文件的依赖性,如果找到在根据规则生成.o文件;
- 因为.c文件和.h文件存在,make会生成.o文件,然后再用。o文件声明make的最终文件,即执行文件main;
6.编写步骤
有5个文件:main.c my1.h my2.h my1.c my2.c
1) main: main.o my1.o my2.o gcc -o main main.o my1.o my2.i
main.o: main.c my1.h my2.
gcc -o main.c
my1.o: my1.c my1.h
gcc -o my1.c
my2.o:my2.c my2.h
gcc -o my2.c
clean:
rm -f *.o main
2)执行命令:make生成可执行文件main。
Tab键 gcc -o ELF_main 生成执行文件main(在定义好依赖关系后,后续一行定义如何生成目标文件的操作系统命令,一定要以Tab键作为开头)
目标文件包括main、 .o(中间目标文件)、 依赖文件(冒号后的文件)。每一个.o文件有一组依赖文件,而.o文件又是main的依赖文件。从依赖关系可看出目标文件是由哪些文件生成的。
make clean会删除所以目标文件,重新编译。clean放在文件的最后而且clean只是一个动作。要make执行后面的命令,make 后必须的指出clean的名字
make会一层一层地找文件的依赖关系,直到找到第一个目标文件。如果在寻找过程中没有找到目标文件,make会直接退出并且报错。make只管文件的依赖性,而对于命令定义错误或编译失败,他是不会搭理的。
6. make与Makefile的区别
make是一个命令,Makefile是一个文件;当Makefile文件写好后,只需make将Makefile运行起来。 三、linux下文件操作函数与系统调用函数
文件操作函数:open read write close lseek stat
int open(char *path,int flag)//打开一个普通文件 ,打开成功返回文件描述符
int read(int fd ,void *buff,size_t size) //按字节读取文件内容
int write(int fd ,void *buff,size_t size) //按字节将内容写入文件中
int close(int fd)//关闭打开的文件
int lseek(int fd,int size,int flag) //移动读文件偏移量
三个stat函数获取文件属性信息
int stat(char *path,struct stat *st);
int fstat(int fd,struct stat *st);
int lstat(char *path,struct stat *st);