對 makefile 中 .SUFFIXES 的學習體會


當前目錄中存在 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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM