在對makefile進行了部分學習後,感覺到還是多看看簡短的例子比較好。
hellomake.c:
複製**
#include
int main()
複製**
hellofunc.c:
複製**
#include
#include
void myprinthellomake(void)
複製**
hellomake.h: /*
example include file */
void myprinthellomake(void);
第乙個 makefile的例子:
hellomake: hellomake.c hellofunc.c
gcc -o hellomake hellomake.c hellofunc.c -i.
hellomake 是規則名;它的前提條件是:hellomake.c 和 hellofunc.c。
在此規則中,我們要執行的片段是: gcc -o hellomake hellomake.c hellofunc.c -i
第二個 makefile的例子:
cc=gcc
cflags=-i.
hellomake: hellomake.o hellofunc.o
$(cc) -o hellomake hellomake.o hellofunc.o -i.
此處定義了 變數 cc 和 cflags , 這也是很多 makefile中很常見的兩個變數。
此時,規則 hellomake 依賴於兩個目標檔案 hellomake.o 和 hellofunc.o ,
而且這裡有乙個隱含的依賴關係:
hellomake.o 來自於對 hellomake.c 的編譯
hellofunc.o 來自於 對 hellofunc.c 的編譯
由於為了生成 hellomake,需要 hellomake.o 和 hellofunc.o ,
就意味著實際上需要 hellomake.c 和 hellofunc.c。
$(cc) 就代表了 gcc 命令,此處實際上還尚未使用 cflags 變數。
第三個 makefile例子:
複製**
cc=gcc
cflags=-i.
deps = hellomake.h
%.o: %.c $(deps)
$(cc) -c -o $@ $< $(cflags)
hellomake: hellomake.o hellofunc.o
gcc -o hellomake hellomake.o hellofunc.o -i.
複製**
%.o: 規則表明:每乙個 .o 檔案,都是依賴於 同名的 .c 檔案,和 deps 所定義的標頭檔案。
具體為了生成此 .o 檔案,需要進行編譯動作:
$(cc) -c -o $@ $< $(cflags)
其中 $(cc) 和 -c -o 都不用解釋了。
$@表示的就是 冒號左邊的內容,即某個.o 檔案。
$《表示的就是 冒號右邊的第乙個引數,即此同名的.c 檔案。
$(cflags) 在這裡就是 -i。
第四個 makefile例子:
複製**
cc=gcc
cflags=-i.
deps = hellomake.h
obj = hellomake.o hellofunc.o
%.o: %.c $(deps)
$(cc) -c -o $@ $< $(cflags)
hellomake: $(obj)
gcc -o $@ $^ $(cflags)
複製**
同上個例子相比,它又定義兩個 obj變數。
hellomake 依賴於 obj變數所指代的目標檔案,
gcc -o $@ $^ $(cflags) 中,其他的都不用再解釋了。
$^ 是冒號右邊的值,這裡就是 $(obj),也就是 hellomake.o, hellofunc.o。
第五個 makefile例子:
複製**
idir =../include
cc=gcc
cflags=-i$(idir)
odir=obj
ldir =../lib
libs=-lm
_deps = hellomake.h
deps = $(patsubst %,$(idir)/%,$(_deps))
_obj = hellomake.o hellofunc.o
obj = $(patsubst %,$(odir)/%,$(_obj))
$(odir)/%.o: %.c $(deps)
$(cc) -c -o $@ $< $(cflags)
hellomake: $(obj)
gcc -o $@ $^ $(cflags) $(libs)
.phony: clean
clean:
rm -f $(odir)/*.o *~ core $(incdir)/*~
複製**
這裡面 idir,ldir,odir 分別指定了 標頭檔案/庫檔案/輸出目標檔案的目錄。
來看這一句:
deps = $(patsubst %,$(idir)/%,$(_deps))
patsubst 是乙個 函式,它會把所有 % 所代表的檔案字串,改變為 頭檔案目錄下的 檔案字串。
第三個引數 $(_deps)指明了這個 函式的作用範圍。
obj = $(patsubst %,$(odir)/%,$(_obj)) 的作法與此類似。
其他的,也沒有什麼可以說的了,但是 這裡有乙個偽規則 clean。它是沒有前提條件的。
rm -f $(odir)/*.o *~ core $(incdir)/*~ 中,
*~ , 我猜測代表的是 所有沒有副檔名的檔案。core 指代的是程式出錯時生成的 core 檔案。
標籤: makefile, example
gSOAP學習體會
include soaph.h 得到存根程式 include sendemailbinding.nsmap 得到命名空間對映表 include include include soapsendemailbindingproxy.h using namespace std int main int a...
git 學習體會
下午頭暈呀。學而不思則則罔,看了好幾天git,隨便寫寫來整理下思路。這幾天主要做了3個事情,一是寫了20多頁的ppt 準備交流,乙個是看了progit的中文件,還有乙個是在stackoverflow上提了幾個問題。對git也算入門了吧,熟練掌握常用命令的含義和用法 不帶參的 知道了git的儲存和資料...
UI學習體會
很多時候自我感覺做好的一件事情,往往並不會得到別人的認可 經不起別人的推敲,總是自己被澆的狗血淋頭 很多時候,我們都沒有站在另外的乙個角度去看問題 也許不是你要做多少多少事情,關鍵是你要別人承認你的價值所在 今天上完ui作業點評後,才發現自己可以去石化了 很多資訊不是我們自我感覺好了就ok了 我們程...