當(dāng)前位置:
首頁(yè) >
make 学习体会(一)
發(fā)布時(shí)間:2025/7/14
33
豆豆
生活随笔
收集整理的這篇文章主要介紹了
make 学习体会(一)
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
在對(duì)makefile進(jìn)行了部分學(xué)習(xí)后,感覺(jué)到還是多看看簡(jiǎn)短的例子比較好。
發(fā)現(xiàn)下面這個(gè)網(wǎng)站講得很好:
http://www.cs.colby.edu/maxwell/courses/tutorials/maketutor/
hellomake.c:
復(fù)制代碼 #include? int main() { // call a function in another file myPrintHelloMake();
return(0); } 復(fù)制代碼 hellofunc.c:
復(fù)制代碼 #include? #include?
void myPrintHelloMake(void) { printf("Hello makefiles!\n"); return; } 復(fù)制代碼 hellomake.h:
/* example include file */ void myPrintHelloMake(void); 第一個(gè) makefile的例子:
hellomake: hellomake.c hellofunc.c gcc -o hellomake hellomake.c hellofunc.c -I. hellomake 是規(guī)則名;它的前提條件是:hellomake.c 和 hellofunc.c。
在此規(guī)則中,我們要執(zhí)行的片段是: gcc -o hellomake hellomake.c hellofunc.c -I
第二個(gè) makefile的例子:
CC=gcc CFLAGS=-I.
hellomake: hellomake.o hellofunc.o $(CC) -o hellomake hellomake.o hellofunc.o -I. 此處定義了 變量 cc 和 CFLAGS , 這也是很多 makefile中很常見(jiàn)的兩個(gè)變量。
此時(shí),規(guī)則 hellomake 依賴于兩個(gè)目標(biāo)文件 hellomake.o 和 hellofunc.o ,
而且這里有一個(gè)隱含的依賴關(guān)系:
hellomake.o 來(lái)自于對(duì) hellomake.c 的編譯
hellofunc.o 來(lái)自于 對(duì) hellofunc.c 的編譯
由于為了生成 hellomake,需要 hellomake.o 和 hellofunc.o ,
就意味著實(shí)際上需要 hellomake.c 和 hellofunc.c。
$(CC) 就代表了 gcc 命令,此處實(shí)際上還尚未使用 CFLAGS 變量。
第三個(gè) makefile例子:
復(fù)制代碼 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. 復(fù)制代碼 %.o: 規(guī)則表明:每一個(gè) .o 文件,都是依賴于 同名的 .c 文件,和 DEPS 所定義的頭文件。
具體為了生成此 .o 文件,需要進(jìn)行編譯動(dòng)作:
$(CC) -c -o $@ $< $(CFLAGS)
其中 $(CC) 和 -c -o 都不用解釋了。
$@表示的就是 冒號(hào)左邊的內(nèi)容,即某個(gè).o 文件。
$<表示的就是 冒號(hào)右邊的第一個(gè)參數(shù),即此同名的.c 文件。
$(CFLAGS) 在這里就是 -I。
第四個(gè) makefile例子:
復(fù)制代碼 CC=gcc CFLAGS=-I. DEPS = hellomake.h OBJ = hellomake.o hellofunc.o?
%.o: %.c $(DEPS) $(CC) -c -o $@ $< $(CFLAGS)
hellomake: $(OBJ) gcc -o $@ $^ $(CFLAGS) 復(fù)制代碼 同上個(gè)例子相比,它又定義兩個(gè) OBJ變量。
hellomake 依賴于 OBJ變量所指代的目標(biāo)文件,
gcc -o $@ $^ $(CFLAGS) 中,其他的都不用再解釋了。
$^ 是冒號(hào)右邊的值,這里就是 $(OBJ),也就是 hellomake.o, hellofunc.o。
第五個(gè) makefile例子:
復(fù)制代碼 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)/*~? 復(fù)制代碼 這里面 IDIR,LDIR,ODIR 分別指定了 頭文件/庫(kù)文件/輸出目標(biāo)文件的目錄。
來(lái)看這一句:
DEPS = $(patsubst %,$(IDIR)/%,$(_DEPS)) patsubst 是一個(gè) 函數(shù),它會(huì)把所有 % 所代表的文件字符串,改變?yōu)?頭文件目錄下的 文件字符串。
第三個(gè)參數(shù) $(_DEPS)指明了這個(gè) 函數(shù)的作用范圍。
OBJ = $(patsubst %,$(ODIR)/%,$(_OBJ)) 的作法與此類似。
其他的,也沒(méi)有什么可以說(shuō)的了,但是 這里有一個(gè)偽規(guī)則 clean。它是沒(méi)有前提條件的。
rm -f $(ODIR)/*.o *~ core $(INCDIR)/*~ 中,
*~ , 我猜測(cè)代表的是 所有沒(méi)有擴(kuò)展名的文件。core 指代的是程序出錯(cuò)時(shí)生成的 core 文件。
標(biāo)簽: Makefile, example
本文轉(zhuǎn)自健哥的數(shù)據(jù)花園博客園博客,原文鏈接:http://www.cnblogs.com/gaojian/archive/2012/09/17/2688165.html,如需轉(zhuǎn)載請(qǐng)自行聯(lián)系原作者
發(fā)現(xiàn)下面這個(gè)網(wǎng)站講得很好:
http://www.cs.colby.edu/maxwell/courses/tutorials/maketutor/
hellomake.c:
復(fù)制代碼 #include? int main() { // call a function in another file myPrintHelloMake();
return(0); } 復(fù)制代碼 hellofunc.c:
復(fù)制代碼 #include? #include?
void myPrintHelloMake(void) { printf("Hello makefiles!\n"); return; } 復(fù)制代碼 hellomake.h:
/* example include file */ void myPrintHelloMake(void); 第一個(gè) makefile的例子:
hellomake: hellomake.c hellofunc.c gcc -o hellomake hellomake.c hellofunc.c -I. hellomake 是規(guī)則名;它的前提條件是:hellomake.c 和 hellofunc.c。
在此規(guī)則中,我們要執(zhí)行的片段是: gcc -o hellomake hellomake.c hellofunc.c -I
第二個(gè) makefile的例子:
CC=gcc CFLAGS=-I.
hellomake: hellomake.o hellofunc.o $(CC) -o hellomake hellomake.o hellofunc.o -I. 此處定義了 變量 cc 和 CFLAGS , 這也是很多 makefile中很常見(jiàn)的兩個(gè)變量。
此時(shí),規(guī)則 hellomake 依賴于兩個(gè)目標(biāo)文件 hellomake.o 和 hellofunc.o ,
而且這里有一個(gè)隱含的依賴關(guān)系:
hellomake.o 來(lái)自于對(duì) hellomake.c 的編譯
hellofunc.o 來(lái)自于 對(duì) hellofunc.c 的編譯
由于為了生成 hellomake,需要 hellomake.o 和 hellofunc.o ,
就意味著實(shí)際上需要 hellomake.c 和 hellofunc.c。
$(CC) 就代表了 gcc 命令,此處實(shí)際上還尚未使用 CFLAGS 變量。
第三個(gè) makefile例子:
復(fù)制代碼 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. 復(fù)制代碼 %.o: 規(guī)則表明:每一個(gè) .o 文件,都是依賴于 同名的 .c 文件,和 DEPS 所定義的頭文件。
具體為了生成此 .o 文件,需要進(jìn)行編譯動(dòng)作:
$(CC) -c -o $@ $< $(CFLAGS)
其中 $(CC) 和 -c -o 都不用解釋了。
$@表示的就是 冒號(hào)左邊的內(nèi)容,即某個(gè).o 文件。
$<表示的就是 冒號(hào)右邊的第一個(gè)參數(shù),即此同名的.c 文件。
$(CFLAGS) 在這里就是 -I。
第四個(gè) makefile例子:
復(fù)制代碼 CC=gcc CFLAGS=-I. DEPS = hellomake.h OBJ = hellomake.o hellofunc.o?
%.o: %.c $(DEPS) $(CC) -c -o $@ $< $(CFLAGS)
hellomake: $(OBJ) gcc -o $@ $^ $(CFLAGS) 復(fù)制代碼 同上個(gè)例子相比,它又定義兩個(gè) OBJ變量。
hellomake 依賴于 OBJ變量所指代的目標(biāo)文件,
gcc -o $@ $^ $(CFLAGS) 中,其他的都不用再解釋了。
$^ 是冒號(hào)右邊的值,這里就是 $(OBJ),也就是 hellomake.o, hellofunc.o。
第五個(gè) makefile例子:
復(fù)制代碼 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)/*~? 復(fù)制代碼 這里面 IDIR,LDIR,ODIR 分別指定了 頭文件/庫(kù)文件/輸出目標(biāo)文件的目錄。
來(lái)看這一句:
DEPS = $(patsubst %,$(IDIR)/%,$(_DEPS)) patsubst 是一個(gè) 函數(shù),它會(huì)把所有 % 所代表的文件字符串,改變?yōu)?頭文件目錄下的 文件字符串。
第三個(gè)參數(shù) $(_DEPS)指明了這個(gè) 函數(shù)的作用范圍。
OBJ = $(patsubst %,$(ODIR)/%,$(_OBJ)) 的作法與此類似。
其他的,也沒(méi)有什么可以說(shuō)的了,但是 這里有一個(gè)偽規(guī)則 clean。它是沒(méi)有前提條件的。
rm -f $(ODIR)/*.o *~ core $(INCDIR)/*~ 中,
*~ , 我猜測(cè)代表的是 所有沒(méi)有擴(kuò)展名的文件。core 指代的是程序出錯(cuò)時(shí)生成的 core 文件。
標(biāo)簽: Makefile, example
本文轉(zhuǎn)自健哥的數(shù)據(jù)花園博客園博客,原文鏈接:http://www.cnblogs.com/gaojian/archive/2012/09/17/2688165.html,如需轉(zhuǎn)載請(qǐng)自行聯(lián)系原作者
總結(jié)
以上是生活随笔為你收集整理的make 学习体会(一)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: ssm整合(基于xml配置方式)
- 下一篇: 【单页应用】全局控制器app应该干些什么