zoukankan      html  css  js  c++  java
  • 对 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

  • 相关阅读:
    Yii2 分页
    Yii2 或者当前登录用户帐号
    css3媒体查询判断移动设备横竖屏
    Javascript操作Tr隐藏显示变形~
    php注释标准
    匹配一段html中所有的src
    数据库遇到错误(随时补充)
    NetCore-缓存文件上传和文件流上传
    SVN跨服务器版本迁移
    发票同步微信卡包
  • 原文地址:https://www.cnblogs.com/gaojian/p/2696482.html
Copyright © 2011-2022 走看看