1、头文件的书写
刚开始要注意一个格式:条件编译(作用:防止头文件被重复包含)
假设头文件叫main.h,格式如下:
#ifndef _MAIN_H
#define _MAIN_H
1、其他头文件
2、宏的定义
3、枚举的定义
4、结构体的定义
5、共用体的定义
6、函数的声明
7、全局变量的引用(extern)
#endif
2、对工程的理解
一个主文件+若干个子文件+若干个头文件(若干个子文件均是由主文件进行调用)。
其组成和作用如下:
- 总控Makefile:是一个普通文件,用来控制src和obj文件夹里面的makefile执行。
- include:所有的.h文件。
- bin:包含可执行文件,可以是多个。
- obj:包含所有的.o文件及其makefile文件(makefile的作用:所有的.o文件经过链接生成可执行文件,并将其移动至bin目录下)。
- src:包含所有的.c文件及其makefile(makefile的作用:所有的.c文件经过单独编译不链接生成.o文件,并将其移动至obj目录下)。
理解make工具
特点:根据时间戳来执行的。
时间戳:只会查找:当前文件的时间和上次编译之后的文件的时间存在时间差值的文件,将其进行编译。
3、 Make的格式:
目标:依赖
[Tab键]命令表
解释:
- 目标:类比成一个产品。
- 依赖:生成这个产品的材料。
- 命令表:交代了如何将材料制作成产品。
注意:输完目标和依赖之后,按下回车,如果光标的位置还在该行的开头位置,就需要按下Tab键,如果发现此时自己往后缩进了,就不需要按下。
make是如何执行的?
首先判断依赖是否存在,得出两个结果:
-
依赖存在:直接经由命令表生成目标即可
-
依赖不存在:肯定不能直接一步生成目标,但是不意味着就要结束,因为改文本下方可能存在了该依赖作为一个目标是如何被生成的。因此需要先执行下方的代码,然后回过头再继续生成刚开始需要被生成的目标。
4、如何执行make
格式:make 目标名
注意:最常用的形式是只输入make就可以的(此时进入makefile这个文件之后,会将遇到的第一个目标作为自己的首要目标来进行执行,只要该首要目标被完成了,就直接会终止Makefile文件的执行)
5、make中的一些变量
-
用户自定义变量
定义变量格式
定义:变量名
赋值:变量名:=值
使用变量的值:$(变量名)
-
自动变量
$@:目标
$<:依赖中的第一个依赖
$^:依赖中的所有依赖
-
系统预定义变量
CC:代表C编译器的名称,默认值为cc,赋值为gcc
CFLAGS:代表C编译器的选项,无默认值,赋值: -c -g -Wall
RM:代表删除,默认值rm -f
-
环境变量
export:可以指明将赋值给其的所有变量应用于整个工程。
实例:makefile_hello(管理一个.c文件)
1、新建hello.c文件
#include <stdio.h>
int main(int argc, const char *argv[])
{
printf("hello world!\n");
return 0;
}
2、新建Makefile文件
MyHaha:hello.o
gcc hello.o -o MyHaha
hello.o:hello.c
gcc -c hello.c -o hello.o
ps:首先执行
Myhaha:hello.0
发现无依赖文件hello.o,然后执行
hello.o:hello.c
存在hello.c文件,执行完:
gcc -c hello.c -o hello.o
回去再执行
gcc hello.o -o MyHaha
目标完成。
3、此文件夹下,会出现以下文件
4、在编译器下输入./MyHaha,即可打印:“hello world!”。
以上就是简单的makefile的实现,复杂的原理相同。