# 當前目錄存在 main.c tool.c tool.h 三個檔案
# 下面是makefile 檔案內容
main: main.o tool.o
gcc main.o tool.o - main
.phony: clean
clean:
-rm main *.o
執行 make 後輸入如下:
cc -c -o main.o main.c
cc -c -o tool.o tool.c
gcc main.o tool.o -o main
並生成乙個可執行檔案main
預設情況下:
make 會在當前目錄下找名字叫 「makefile」 或 「makefile」 的檔案。
如何找到,他會找到檔案中第乙個目標檔案(target), 並把這個target作為最終的目標檔案,如前面示例中的"main".
如果main 檔案不存在, 或 main 所依賴的 .o 檔案的修改時間要比main檔案新, 那麼它會執行後面所定義的命令來生成main檔案.
如果 main 所依賴的 .o 檔案也存在, 那麼make會在當前檔案中找到目標為 .o檔案的依賴性, 若找到則根據規則生成.o檔案。
make 在用 .o檔案宣告make的終極任務, 也就是執行檔案 「make」.
objects = main.o tool.o
main: $(objects)
gcc $(objects) -o main
.phony: clean
clean:
-rm main $(objects)
執行make後輸入如下
cc -c -o main.o main.c
cc -c -o tool.o too.c
gcc main.o tool.o -o main
# 法格式
include # 舉個例子,你有這樣幾個makefile:a.mk, b.mk, c.mk 還有乙個檔案叫 foo.make, 以及乙個變數$(bar), 其包含了 e.mk, f.mk
include foo.make *.mk $(bar)
# 等價於
include foo.make a.mk b.mk c.mk e.mk f.mk
# 如果找不到檔案,而您希望make時不理會那些無法讀取的檔案而繼續執行
# 可以在include前新增乙個減號"-", 如:
-include
如何當前環境中定義了環境變數makefiles,那麼,make會把這個變數中的值作為乙個類似include的動作。
這個變數中的值是其他的makefile,用空格分隔。只是,它和include 不同的是,
從這個環境變數中引入的makefile的「目標」 不會起作用,如果環境變數中定義的檔案發現錯誤,
make也不會理。但是建議不要使用這個環境變數,因為只要這個變數一被定義
,那麼當你使用make時,所有的makefile都會受到影響。也許有時候makefile出現奇怪的事,
那麼可以檢視當前環境變數中有沒有定義這個變數。
define func
$(info echo "hello")
endef
# 呼叫
$(call func)
define func1
$(info echo $(1)$(2))
endef
# 呼叫
$(call func1, hello, wolrd)
gun的make工作是的執行步驟:
讀取所有的makefile
讀入被include 的其他makefile
初始化檔案中的變數
推導隱晦規則,並分析所有規則
為所有的目標檔案建立依賴關係鏈
根據依賴關係,決定哪些目標要重新生成
執行生成命名
Makefile簡單入門
作為linux或unix下的程式開發人員,大家一定都遇到過makefile,用make命令來編譯自己寫的程式確實是很方便。一般開發情況下,大家都是手工寫乙個簡單makefile。下面先給乙個最簡單的示例 makefile示例 object main.o function.o change objec...
makefile 簡單例項
3 複雜專案 makefile 編寫 變數定義和初始化 可選 目標 依賴項 指令目標 依賴項 指令.注 指令可以是編譯指令或其它可以在命令列執行的指令。定義變數後就可以在 目標 依賴 指令 中訪問 var name 檔案結構 檔案內容 main.c include extern intaddint ...
簡單編寫makefile
乙個makefile基本的規則 a b tab tab a為目標檔案,b為依賴檔案 可能含有多個 接下來為命令 必須含有tab 操作依賴檔案得到目標檔案 以乙個簡單的示例來演示如何編寫乙個基礎的makefile ifndef file1 h define file1 h ifdef cplusplu...