什麼是makefile?也許非常多winodws的程式設計師都不知道這個東西,由於那些windows的ide都為你做了這個工作,但我認為要作乙個好的android底層程式設計師。
makefile還是要懂。
特別在unix下的軟體編譯,你就不能不自己寫makefile了,會不會寫makefile,從乙個側面說明了乙個人是否具備完畢大型project的能力。
由於,makefile關係到了整個project的編譯規則。乙個project中的原始檔不計數,其按型別、功能、模組分別放在若干個資料夾中。
makefile定義了一系列的規則來指定,哪些檔案須要先編譯,哪些檔案須要後編譯,哪些檔案須要又一次編譯,甚至於進行更複雜的功能操作。
由於makefile就像乙個shell指令碼一樣。當中也能夠執行作業系統的命令。makefile帶來的優點就是——「自己主動化編譯」。一旦寫好,
僅僅須要乙個make命令,整個project全然自己主動編譯,極大的提高了軟體開發的效率。
makefile基本教程。參考文件:
因為各種編譯須要,你須要做的最主要的就是看懂makefile。最主要的就是makefile中的賦值操作。
在makefile中我們常常看到 = := ?
= +=這幾個賦值運算子。那麼他們有什麼差別呢?我們來做個簡單的實驗
新建乙個makefile。內容為:
ifdef define_vre
vre = 「hello world!」
else
endif
ifeq ($(opt),define)
vre ?= 「hello world! first!」
endif
ifeq ($(opt),add)
vre += 「kelly!」
endif
ifeq ($(opt),recover)
vre := 「hello world! again!」
endif
all:
@echo $(vre)
敲入下面make命令:
make define_vre=true opt=define 輸出:hello world!
make define_vre=true opt=add 輸出:hello world! kelly!
make define_vre=true opt=recover 輸出:hello world! again!
make define_vre= opt=define 輸出:hello world! first!
make define_vre= opt=add 輸出:kelly!
make define_vre= opt=recover 輸出:hello world! again!
從上面的結果中我們能夠清楚的看到他們的差別了
= 是最主要的賦值
:= 是覆蓋之前的值
?= 是假設沒有被賦值過就賦予等號後面的值
+= 是加入等號後面的值
之前一直糾結makefile中「=」和「:=」的差別究竟有什麼差別,由於給變數賦值時,兩個符號都在使用。網上搜了一下,有人給出了解答,可是本人愚鈍。看不懂什麼意思。幾尋無果之下,也就放下了。今天看一篇部落格。無意中發現作者對於這個問題做了非常好的解答。解決這個問題之餘不免感嘆,有時候給個樣例不就清楚了嗎?為什麼非要說得那麼學術呢。^_^
1、「=」
make會將整個makefile展開後,再決定變數的值。也就是說,變數的值將會是整個makefile中最後被指定的值。
看樣例:
x = foo
y = $(x) bar
x = xyz
在上例中,y的值將會是 xyz bar ,而不是 foo bar 。
2、「:=」
「:=」表示變數的值決定於它在makefile中的位置。而不是整個makefile展開後的終於值。
x := foo
y := $(x) bar
x := xyz
在上例中,y的值將會是 foo bar 。而不是 xyz bar 了。
參考文件:
tips:
另外在c語言中三目運算中:
假設在條件語句中,僅僅執行單個的賦值語句時, 常可使用條件表示式來實現。
不但使程式簡潔,也提高了執行效率。
條件運算子為?和:,它是乙個三目運算子。即有三個參與運算的量。
由條件運算子組成條件表示式的一般形式為:
表示式1?
表示式2: 表示式3
其求值規則為:假設表示式1的值為真,則以表示式2 的值作為條件表示式的值,否則以表示式2的值作為整個條件表示式的值。
條件表示式通經常使用於賦值語句之中。
比如條件語句:
if(a>b) max=a;
else max=b;
可用條件表示式寫為 max=(a>b)?a:b; 執行該語句的語義是:如a>b為真,則把a賦予max,否則把b 賦予max。
使用條件表示式時,還應注意下面幾點:
1. 條件運算子的運算優先順序低於關係運算子和算術運算子,但高於賦值符。
因此 max=(a>b)?
a:b能夠去掉括號而寫為 max=a>b?
a:b2. 條件運算子?
和:是一對運算子,不能分開單獨使用。
3. 條件運算子的結合方向是自右至左。
makfile 中 變數的含義
例子 dep sed dependencies q makefile tmp dep sed dependencies q makefile tmp make for i in init c do echo n init cpp m i done tmp make cp tmp make makef...
Makfile檔案編寫
一 make是什麼 gnu make是乙個工程管理器,專門負責管理 維護較多檔案的處理,實現自動化編譯。如果乙個工程專案中,有成百上千個 原始檔,若其中乙個或多個檔案進過修改,make就需要能夠自動識別更新了的 不需要像方法1一樣逐個輸入編譯冗長的命令列,就可以完成最後的編譯工作。make執行時,自...
如何在makfile中檢視變數的值
在makefile中檢視變數的取值是多少應該是乙個比較麻煩的問題,但是本大神自己研究出乙個十分方便的方法.這個方法十分簡單。現在介紹如下 如果在乙個十分複雜龐大的makefile檔案中,有個地方用到乙個變數src file,你很想知道makefile執行到此處的時候這個變數的值為多少。那麼你可以在這...