makefile簡單認識

2021-09-29 13:18:02 字數 2023 閱讀 6101

# 當前目錄存在 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...