Makefile


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

下面是所有的自動化變量及其說明:

$@
表示規則中的目標文件集。在模式規則中,如果有多個目標,那么,"$@"就是匹配於目標中模式定義的集合。
$< 
依賴目標中的第一個目標名字。如果依賴目標是以模式(即"%")定義的,那么"$<"將是符合模式的一系列的文件集。注意,其是一個一個取出來的。
$?
所有比目標新的依賴目標的集合。以空格分隔。
$^
所有的依賴目標的集合。以空格分隔。如果在依賴目標中有多個重復的,那個這個變量會去除重復的依賴目標,只保留一份。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM