makefile的使用總結

2021-06-20 08:20:05 字數 1872 閱讀 7295

需要注意的幾點:

1在乙個makefile中定義的變數不能自動傳遞到下層的makefile,即使使用export關鍵字宣告將其傳遞到子makefile中,也不能對其進行賦值操作。同時在makefile中定義的變數不能夠在target的執行命令中進行賦值,只能在全域性宣告中進行宣告,賦值操作。

2在編寫makefie時,每個目標依賴的不光可以是.a, .o這樣的用於編譯的檔案,也可以是其他的目標,在其他的目標中執行一些指令碼之類的,比如建立目錄,複製檔案等一些操作。

3在makefile中可以使用make -csubdir/,來強制執行子目錄下的makefile,使用include /subdir/makefile,包含子目錄的makefile,這樣的話,就會把子目錄的makefile展開在父目錄的makefile中。

4多使用自動化變數,我們常用的是$@,$<,其中$@是表示每乙個生成目標,$《是用來表示每乙個依賴目標。下面是其常見用法:

%.o: %.c

gcc-c $<

對該包含該語句的makefile執行make命令時,系統實際上會根據檔案生成多個實際的依賴關係,比如目錄subdir下有兩個檔案test1.c, test2.c則會生成test1.o: test1.c ,test2.o:test2.c這兩個依賴關係。

5使用在shell中定義的變數時,需要使用$$var來引用該變數,而不是$var

下面是我的乙個小例子:

root@localhost:/home/ngos/testmakefile.bak>ls

makefile makefile.bak  ngtos  subdir subdir1  target  test

工程分別由test, subdir, subdir1三個目錄的原始碼編譯而成,對於每個目錄先生成乙個.a然後生成乙個可執行檔案ngtos。

主makefile:

objects= target/test.a  target/subdir.atarget/subdir1.a

dirs=subdir subdir1 test

export count= 1

#all:$(objects) end

all: maketarget

gcc-o ngtos  $(objects)

maketarget:

cross_compile=helloword;\

echo$$cross_compile

fordir in $(dirs); do \

make-c $$dir/ all;\

done

target/subdir.a:

make-c subdir/ all

target/subdir1.a:

make-c subdir1/ all

target/test.a:

#ar-r test.a test1.o test2.o

#mvtest.a target/i

make-c test/ all

%.o:%.c

gcc-c $<

end:

@echo"@@@@@@@@#####here end!"        

clean:

rm-f target/*

-rm-f *.o

make-c subdir/ clean

make-c subdir1/ clean   

子makefile:

all: test.a

mvtest.a ../target/

test.a: test1.o test2.o

@echo$(@)

ar-r $(@) test1.o test2.o

%.o: %.c

gcc-c $<

clean:

-rm-f *.o

Makefile 函式總結

makefile makefile有三個非常有用的變數。分別是 代表的意義分別是 目標檔案,所有的依賴檔案,第乙個依賴檔案。函式 subst subst from,to,text 將text的子串from變為to 函式 patsubst 格式 patsubst 名稱 模式字串替換函式 patsubs...

makefile中 的使用

轉一篇博文 makefile 段1 var 3 target prerequsite1 prerequsite2 echo var 1 var 4 2 echo var 3 echo var 4 1 在 段1中,1 的結果是3,顯然makefile利用自己的變數將 var擴充套件成3之後傳遞給這個e...

Makefile的簡單使用

簡介 乙個工程中的原始檔不計其數,其按型別 功能 模組分別放在若干個目錄中,makefile定義了一系列的規則來指定,哪些 檔案需要先編譯,哪些檔案需要後編譯,哪些檔案需要重新編譯,甚至於進行更複雜的功能操作,因為 makefile就像乙個shell 指令碼一樣,其中也可以執行作業系統的命令。lin...