make 學習體會 一

2021-09-22 09:08:03 字數 3013 閱讀 8979

在對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了 我們程...