Linux-C-Program:makefile 1. 概述 2. 示例说明 3.Makefile详解 3.1 Makefile的文件名称 4. 执行流程 当用户敲下make命令时,make工具会去找当前C工程目录下的Makefile或者makefile文件 找到Makefile这个文件后,它会找到第一个目标文件。然后去当前C工程目录下是否有main这个可执行的文件。然后判断这个可执行文件是否是最新的,如果是最新的,则不需要编译 如果不存在main这个可执行文件,make命令就会去生成.o中间目标文件,然后生成main可执行文件 如果main存在,make回去比较中间文件.o文件是否更新,如果是最新的则不需要更新,不是最新的继续往下找依赖,找到有需要更新的目标文件的时候,就会执行编译命令 整个make的依赖性就是make会一层层去找依赖关系,并且比较是否需要更新,直到编译出最终的可执行目标文件 5. 变量使用 5. 变量使用 6. ma
注:本文参照博客:https://blog.****.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引用其他文件
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中也可以使用变量。变量可以用
使用变量最大的好处就是大大简化了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
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