makefile學習筆記(二)

2021-05-25 17:24:36 字數 1718 閱讀 6778

乙個示例:我們的工程有8個c檔案和3個頭檔案,需要寫乙個makefile來告訴make命令如何編譯和鏈結這幾個檔案。規則是:

1 .   如果這個工程沒有編譯過,那麼所有的c檔案都要編譯並被鏈結。

2 .   如果這個工程的某幾個c檔案被修改,那麼我們只編譯被修改的c檔案,並鏈結目標程式。

3 .   如果這個工程的標頭檔案改變了,那麼我們需要編譯引用了這幾個標頭檔案的c檔案,也就是哪個c檔案引用這幾個改動的標頭檔案,那這幾個c檔案需要重新編譯並鏈結目標從程式。

只要makefile寫的好,乙個make命令就可以完成工作,make命令會自動智慧型的根據當前的檔案修改的情況來確定哪些檔案需要編譯,從而自己編譯所需要的檔案和鏈結目標程式。

示例;makefile檔案如下;

edit : main.o kbd.o command.o display.o / insert.o search.o files.o utils.o cc -o edit main.o kbd.o command.o display.o / insert.o search.o files.o utils.o main.o : main.c defs.h cc -c main.c kbd.o : kbd.c defs.h command.h cc -c kbd.c command.o : command.c defs.h command.h cc -c command.c display.o : display.c defs.h buffer.h cc -c display.c insert.o : insert.c defs.h buffer.h cc -c insert.c search.o : search.c defs.h buffer.h cc -c search.c files.o : files.c defs.h buffer.h command.h cc -c files.c utils.o : utils.c defs.h cc -c utils.c clean : rm edit main.o kbd.o command.o display.o / insert.o search.o files.o utils.o

其中(/)是換行符的意思。

在makefile檔案目錄下直接輸入命令:make 就可以生成edit可執行檔案。

刪除執行檔案和所有的中間目標檔案,只需要「make clean」就ok了。

在這個makefile中,目標檔案(target)包含:執行檔案edit和中間目標檔案(*.o),依賴檔案(prerequisites)就是冒號 後面的那些 .c 檔案和 .h檔案。每乙個 .o 檔案都有一組依賴檔案,而這些 .o 檔案又是執行檔案 edit 的依賴檔案。依賴關係的實質上就是說明了目標檔案是由哪些檔案生成的,換言之,目標檔案是哪些檔案更新的。

在定義好依賴關係後,後續的那一行定義了如何生成目標檔案的作業系統命令,一定要以乙個tab鍵作為開頭。記住,make並不管命令是怎 麼工作的,他只管執行所定義的命令。make會比較targets檔案和prerequisites檔案的修改日期,如果prerequisites檔案 的日期要比targets檔案的日期要新,或者target不存在的話,那麼,make就會執行後續定義的命令。

這裡要說明一點的是,clean不是乙個檔案,它只不過是乙個動作名字,有點像c語言中的lable一樣,其冒號後什麼也沒有,那 麼,make就不會自動去找檔案的依賴性,也就不會自動執行其後所定義的命令。要執行其後的命令,就要在make命令後明顯得指出這個lable的名字。 這樣的方法非常有用,我們可以在乙個makefile中定義不用的編譯或是和編譯無關的命令,比如程式的打包,程式的備份,等等。

Makefile學習筆記(二)

每乙個 o檔案都有一組依賴檔案,而這些 o檔案又是執行檔案 edit 的依賴檔案。依賴關係的實質就是說明了目標檔案是由那些檔案生成 目標檔案是由那些檔案更新 事實上make並不管命令是怎麼工作的,只管執行所定義的命令。make會比較targets檔案和prerequisites檔案的修改日期,如果p...

makefile學習筆記 makefile概述

20180411 makefile學習筆記 makefile概述 makefile主要是在unix下軟體編譯時寫的,window下一般不用 unix裡makefile做的事 相當於window裡ide所做的事 會不會寫makefile,從乙個側面說明了乙個人是否具備完成大型工程的能力。makefil...

Makefile學習筆記

makefile for boot asm nasm 定義變數 asmflags i include run qemu system i386 hdd boot.img boot.img boot.asm asm boot.asm f bin o boot.img install run clean...