Makefile 是和 make 命令一起配合使用的.
很多大型項目的編譯都是通過 Makefile 來組織的, 如果沒有 Makefile, 那很多項目中各種庫和代碼之間的依賴關系不知會多復雜.
Makefile的組織流程的能力如此之強, 不僅可以用來編譯項目, 還可以用來組織我們平時的一些日常操作. 這個需要大家發揮自己的想象力.
長話短說,我們直接來實戰下:
首先我們創建個c文件和h文件:
main.c
#include <stdio.h> #include "fun.h"
int main() { fun(); return 0; }
fun.h
void fun() { printf("hello world!\n"); }
下面就是來對makefile進行編寫:
hello:main.o cc -o hello main.o main.o:main.c fun.h cc -c main.c
.PHONY: hello clean
clean: rm hello main.o
hello:你需要生成的目標文件
main.o:屬於前置條件
cc -o hello main.o:屬於命令
下面代碼也類似
clean:屬於“偽目標”,主要就是用來刪除對象文件
但是,如果當前目錄中,正好有一個文件叫做clean或者hello,那么這個命令不會執行。因為Make發現clean文件已經存在,就認為沒有必要重新構建了,就不會執行指定的rm命令。
為了避免這種情況,可以明確聲明clean和hello是"偽目標",寫法如下。
.PHONY: hello clean
下面我們進行編譯:
在命令行寫入:make
可以發現,目標文件已經生成
然后我們繼續。。。。
發現成功了。。美滋滋
如果文件非常多,我們可以統一編寫如下的makefile文件:
hello:main.o gcc -o $@ $^ .c.o: gcc -c $? .PHONY: hello clean clean: rm hello *.o
下面是所有的自動化變量及其說明:
- $@
- 表示規則中的目標文件集。在模式規則中,如果有多個目標,那么,"$@"就是匹配於目標中模式定義的集合。
- $<
- 依賴目標中的第一個目標名字。如果依賴目標是以模式(即"%")定義的,那么"$<"將是符合模式的一系列的文件集。注意,其是一個一個取出來的。
- $?
- 所有比目標新的依賴目標的集合。以空格分隔。
- $^
- 所有的依賴目標的集合。以空格分隔。如果在依賴目標中有多個重復的,那個這個變量會去除重復的依賴目標,只保留一份。