注:本文参照博客:https://blog.csdn.net/initphp/article/details/7692923php
Makefile是一个C语言的程序编译规则。它可以帮助C语言创建自动化编译流程。一旦写好,即可以经过执行make命令,来编译整个工程。svg
建立项目以下:
val.h和val.c
val.h工具
#include<stdio.h> #include<stdlib.h> #include<unistd.h> int val(int *x);
val.cspa
#include "val.h" int val(int *x) { puts("This is value="); printf("x:%d\n",*x); return 0; }
get.h和get.c
get.h.net
#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.hcode
#include<stdio.h> #include<stdlib.h> #include<unistd.h> int sum(int *x,int *y);
sum.corm
#include "sum.h" #include "val.h" int sum(int *x,int *y){ val(x); puts("This is sum method"); return *x + *y; }
main.cxml
#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\n",z); x = 20; z = get(&x,&y); printf("z:%d\n",z); return 1; }
生成中间目标文件
执行:gcc -c val.c get.c sum.c main.c
生成可执行文件
执行:gcc -o main main.o val.o sum.o get.o
blog
编辑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命令
makefile或者Makefile,通常采用大写(大写比较引人注目)。
当执行make命令时,工具会从当前目录寻找makefile文件。
main:get.o sum.o val.o main.o
,main为目标可执行文件,也就是编译最后成功的文件名称。冒号后面的就是整个可执行文件依赖的中间目标文件。
以.o结尾的就是中间目标文件。冒号后面跟的是目标文件的依赖文件:.h和.c文件
gcc命令表明将中间的目标文件链接起来,最终生成目标可执行文件。须要主要的是,命令行都是在第二行,且以tab键的空格,不然会不生效。
若是一行太长,能够经过符号\
来进行换行。
clean是动做命令。make clean会清除的目标中间文件.o
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
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