當前目錄中存在 gao.g 文件(其實際內容是一個簡單的C語言程序)
先是用如下的例子來看:例子一
.SUFFIXES: .SUFFIXES: .g .o LIBS=gao.o all: $(LIBS) %.o:%g @echo "in %.o:%g"
運行結果是: no rule to make target gao.o...
也就是說 .SUFFIXES 和 %.o:%g 模式規則一起使用沒有效果。
再看看如下的例子:把.SUFFIXES 去掉看看,例子二
LIBS=gao.o all: $(LIBS) %.o:%g @echo "in %.o:%g"
運行結果仍然是:no rule to make target gao.o...
再看看如下的例子: 用傳統格式 .g.o, 例子三
LIBS=gao.o all: $(LIBS) .g.o: @echo "in .g.o"
結果仍然是: no rule to make target gao.o...
再看看如下的例子,在前面例子的基礎上,加入 .SUFFIXES
.SUFFIXES: .SUFFIXES: .g .o LIBS=gao.o all: $(LIBS) .g.o: @echo "in .g.o"
結果是,in .g.o
小結一下:.SUFFIXES 和 .a.b 格式可以相互配合, 和 %b:%a 是無法配合的。
再看 .SUFFIXES 和 .c .o 的關系:
把 gao.g 改名為 gao.c 。看下面的例子:
LIBS=gao.o all:$(LIBS) .c.o: @echo "in .c.o"
運行結果為 in .c.o,也就是說對於.c 文件編譯成 .o 文件,沒有 .SUFFIXES 也可以。
再改為模式規則格式:
LIBS=gao.o all:$(LIBS) %o:%c @echo "in %o:%c"
運行結果為 in %o:%c ,模式規則也不依賴於 .SUFFIXES。
下面的略為跑題。當然,make 對 .c 文件 .o 文件都有自己的處理,比如什么都不寫:
只有如下兩句:
LIBS=gao.o
all: $(LIBS)
運行make 后的結果會怎么樣:
cc -c -o gao.o gao.c
得到了一個 gao.o的文件,但是這個只是一個編譯好但尚未鏈接的程序。
既使chmod 777 gao.o
再運行 ./gao.o 也會得到提示:bash unable to run binary file.
要想運行,還需要手工執行鏈接動作 :cc -o my.o gao.o。
如果沒有makefile ,單純執行,則是不帶-c選項: cc -o gao.o gao.c ,可以得到可執行文件gao.o