注:本文参照博客:https://blog.csdn.net/initphp/article/details/7692923
2. 示例说明
2.1 无makefile编译
2.2 有makefile编译
3.Makefile详解
3.1 Makefile的文件名称
3.2 目标可执行文件
3.3 中间目标文件
3.4 生成目标文件的命令
3.5 换行符
3.6 clean清除操作
4. 执行流程
5. 变量使用
6. make的自动推导功能
7. include引用其他文件
1. 概述
Makefile是一个C语言的程序编译规则。它能够帮助C语言建立自动化编译流程。一旦写好,便可以通过执行make命令,来编译整个工程。
2. 示例说明
创建项目如下:
val.h和val.c
val.h
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
int val(int *x);
val.c
#include "val.h"
int val(int *x) {
puts("This is value=");
printf("x:%d
",*x);
return 0;
}
get.h和get.c
get.h
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
int get(int *x,int *y);
get.c
#include "get.h"
int get(int *x,int *y) {
puts("This is get");
return(*x)*(*y);
}
sum.h和sum.c
sum.h
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
int sum(int *x,int *y);
sum.c
#include "sum.h"
#include "val.h"
int sum(int *x,int *y){
val(x);
puts("This is sum method");
return *x + *y;
}
main.c
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include "sum.h"
#include "get.h"
int main(){
int x = 10;
int y = 20;
int z = sum(&x,&y);
puts("This is Main");
printf("z:%d
",z);
x = 20;
z = get(&x,&y);
printf("z:%d
",z);
return 1;
}
2.1 无makefile编译
生成中间目标文件
执行:gcc -c val.c get.c sum.c main.c
生成可执行文件
执行:gcc -o main main.o val.o sum.o get.o
2.2 有makefile编译
编辑makefile文件
注意:命令行需要[tab]键的空格
main: get.o sum.o val.o main.o
gcc -o main get.o sum.o val.o main.o
main.o:main.c
gcc -c main.c
val.o:val.h val.c
gcc -c val.c
sum.o:val.h sum.h sum.c
gcc -c sum.c
get.o:get.h get.c
gcc -c get.c
clean:
rm -rf *.o
执行make命令
3.Makefile详解
3.1 Makefile的文件名称
makefile或者Makefile,一般采用大写(大写比较引人注目)。
当执行make命令时,工具会从当前目录寻找makefile文件。
3.2 目标可执行文件
main:get.o sum.o val.o main.o
,main为目标可执行文件,也就是编译最后成功的文件名称。冒号后面的就是整个可执行文件依赖的中间目标文件。
3.3 中间目标文件
以.o结尾的就是中间目标文件。冒号后面跟的是目标文件的依赖文件:.h和.c文件
3.4 生成目标文件的命令
gcc命令代表将中间的目标文件连接起来,最终生成目标可执行文件。需要主要的是,命令行都是在第二行,且以tab键的空格,否则会不生效。
3.5 换行符
如果一行太长,可以通过符号来进行换行。
3.6 clean清除操作
clean是动作命令。make clean会清除的目标中间文件.o
4. 执行流程
- 当用户敲下make命令时,make工具会去找当前C工程目录下的Makefile或者makefile文件
- 找到Makefile这个文件后,它会找到第一个目标文件。然后去当前C工程目录下是否有main这个可执行的文件。然后判断这个可执行文件是否是最新的,如果是最新的,则不需要编译
- 如果不存在main这个可执行文件,make命令就会去生成.o中间目标文件,然后生成main可执行文件
- 如果main存在,make回去比较中间文件.o文件是否更新,如果是最新的则不需要更新,不是最新的继续往下找依赖,找到有需要更新的目标文件的时候,就会执行编译命令
- 整个make的依赖性就是make会一层层去找依赖关系,并且比较是否需要更新,直到编译出最终的可执行目标文件
5. 变量使用
Make file中也可以使用变量。变量可以用(object)这样的方式使用。
使用变量最大的好处就是大大简化了Makefile编写难度,增强了Makefile文件的可维护性
object = get.o sum.o val.o main.o
main:${object}
gcc -o main${object}
main.o:main.c
gcc -c main.c
val.o:val.h val.c
gcc -c val.c
sum.o:val.h sum.h sum.c
gcc -c sum.c
get.o:get.h get.c
gcc -c get.c
clean:
rm -rf *.o
6. make的自动推导功能
object = get.o sum.o val.o main.o
main:${object}
gcc -o main${object}
main.o:get.h sum.h
val.o:val.h
sum.o:val.h sum.h
get.o:get.h
clean:
rm -rf *.o
7. include引用其他文件
object = get.o sum.o val.o main.o
main:${object}
gcc -o main${object}
main.o:get.h sum.h
val.o:val.h
sum.o:val.h sum.h
get.o:get.h
clean:
rm -rf *.o