注:本文參照博客: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