makefile

請注意(提示):

gcc,rm等操作語句的開頭必須要添加一個tab空格,否則會報錯 missing separator。

 

 

 

//第一次基本的

#生成test可執行文件,它的依賴於main.o func.o,也就是說生成test你得先生成它們
#2行:gcc前邊必須是tab(Tab鍵空格),表示編譯生成test
test:func.o main.o
 gcc -o test func.o main.o

func.o:func.c   
 gcc -c func.c      

main.o:main.c      
 gcc -c main.c 

clean:
 rm func.o main.o

注意可能沒有編譯到clean來,需要make clean

//第二次 :宏來替代N個

#定義一個宏
objects = main.o func.o
 
test: $(objects)
 gcc -o test $(objects)      

func.o:func.c   
 gcc -c func.c      

main.o:main.c      
 gcc -c main.c  

clean:
 rm $(objects)

第三次:make的“隱晦規則”。
objects = main.o func.o
 
test: $(objects)
 gcc -o test $(objects)      

main.o:func.h
func.o:func.h

.PHONY : clean
clean:
 rm $(objects)

.PHONY表示:clean是個僞目標文件。
向make說明,不管是否有這個文件,這個目標就是 僞目標
表示僅僅刪除該僞目標
---未成功


第四次:替代
objects = main.o func.o
test: $(objects)

$(objects):%.o:%.c
 gcc -c $< -o [email protected]
#gcc -c test $(objects)      
#.PHONY : clean
clean :
 rm $(objects)

$<:表示源文件 *.c
[email protected]:表示目標文件 *.o

也可以將第一行 objects = main.o func.o
替換爲:
objects_all = main.o func.o func.h
objects = $(filter %.o,$(objects_all))

$(filter %.o,$(objects_all))
表示用makefile中的filter函數,只取objects_all中的*.o文件


說明:
如果你想讓make不理那些無法讀取的文件,而繼續執行,你可以在include前加一個減號“-”。如:
-include <filename>

GNU的make工作時的執行步驟入下:
讀入所有的Makefile。
讀入被include的其它Makefile。
初始化文件中的變量。
推導隱晦規則,並分析所有規則。
爲所有的目標文件創建依賴關係鏈。
根據依賴關係,決定哪些目標要重新生成。
執行生成命令。
1-5步爲第一個階段,6-7爲第二個階段。第一個階段中,如果定義的變量被使用了,那麼,make會把其展開在使用的位置。但make並不會完全馬上展開,make使用的是拖延戰術,如果變量出現在依賴關係的規則中,那麼僅當這條依賴被決定要使用了,變量纔會在其內部展開。


targets : prerequisites
        command
        ...
或是這樣:       targets : prerequisites ; command
            command
command是命令行,如果其不與“target:prerequisites”在一行,那麼,必須以[Tab鍵]開頭,如果和prerequisites在一行,那麼可以用分號做爲分隔。
如果命令太長,你可以使用反斜框(‘/’)作爲換行符。make對一行上有多少個字符沒有限制。規則告訴make兩件事,文件的依賴關係和如何成成目標文件。


波浪號(“~”)字符在文件名中也有比較特殊的用途。如果是“~/test”,這就表示當前用戶的$HOME目錄下的test目錄。而“~hchen/test”則表示用戶hchen的宿主目錄下的test目錄。(這些都是Unix下的小知識了,make也支持)而在Windows或是MS-DOS下,用戶沒有宿主目錄,那麼波浪號所指的目錄則根據環境變量“HOME”而定。


objects = *.o
上面這個例子,表示了,通符同樣可以用在變量中。並不是說[*.o]會展開,不!objects的值就是“*.o”。Makefile中的變量其實就是C/C++中的宏。如果你要讓通配符在變量中展開,也就是讓objects的值是所有[.o]的文件名的集合,那麼,你可以這樣:     objects := $(wildcard *.o)


.PHONY: cleanall cleanobj cleandiff
    cleanall : cleanobj cleandiff
            rm program

    cleanobj :
            rm *.o

    cleandiff :
            rm *.diff
使用:
make cleanall
make cleanobj
make cleandiff

 

bigoutput littleoutput : text.g
            generate text.g -$(subst output,,[email protected]) > [email protected]
    上述規則等價於:

    bigoutput : text.g
            generate text.g -big > bigoutput
    littleoutput : text.g
            generate text.g -little > littleoutput
其中,-$(subst output,,[email protected])中的“$”表示執行一個Makefile的函數,函數名爲subst,後面的爲參數。關於函數,將在後面講述。這裏的這個函數是截取字符串的意思,“[email protected]”表示目標的集合,就像一個數組,“[email protected]”依次取出目標,並執於命令。

 

 

 

 

他人的:

CFLAGS 
:
=
 
-
g 
-
Wall 
-
fPIC 
-
DPIC 
-
I
./
 


SOFLAGS : = - shared - Wl ,- E

LDFLAGS : = - L ./ - pthread

GCC = gcc

TARGET : = sip . so

COBJS = ./ Md5Codec . o/
./ SipApi . o/
./ SipHandle . o/
./ SipMessage . o/
./ SipStack . o/
./ SipCall . o/
./ SipLine . o/
./ SipSender . o/
./ SipRecvhandle . o/
./ sdp . o/
./ log . o/

#module sip
$ ( TARGET ): $ ( COBJS )
$ ( GCC ) $ ( SOFLAGS ) $ ( COBJS ) - o $ ( TARGET )

$ ( COBJS ): %. o : %. c
$ ( GCC ) $ ( CFLAGS ) - c $< - o $ @

$ ( LOGOBJS ): %. o : %. c
$ ( GCC ) $ ( CFLAGS ) - c $< - o $ @

clean :
rm $ ( COBJS ) $ ( TARGET ) - rf

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章