需要注意的幾點:
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...