对 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