Makefile

Makefile 是和 make 命令一塊兒配合使用的.spa

不少大型項目的編譯都是經過 Makefile 來組織的, 若是沒有 Makefile, 那不少項目中各類庫和代碼之間的依賴關係不知會多複雜.命令行

Makefile的組織流程的能力如此之強, 不只能夠用來編譯項目, 還能夠用來組織咱們平時的一些平常操做. 這個須要你們發揮本身的想象力.3d

長話短說,咱們直接來實戰下:code

首先咱們建立個c文件和h文件:對象

main.cblog

#include <stdio.h> #include "fun.h"
int main() { fun(); return 0; }

fun.h自動化

void fun() { printf("hello world!\n"); }

下面就是來對makefile進行編寫:io

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:屬於前置條件class

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

下面是全部的自動化變量及其說明:

$@
表示規則中的目標文件集。在模式規則中,若是有多個目標,那麼,"$@"就是匹配於目標中模式定義的集合。
$< 
依賴目標中的第一個目標名字。若是依賴目標是以模式(即"%")定義的,那麼"$<"將是符合模式的一系列的文件集。注意,其是一個一個取出來的。
$?
全部比目標新的依賴目標的集合。以空格分隔。
$^
全部的依賴目標的集合。以空格分隔。若是在依賴目標中有多個重複的,那個這個變量會去除重複的依賴目標,只保留一份。
相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息