关于makefile的问题

关于makefile的问题,makefile,Makefile,这是一个简单的makefile 我有两个问题 全部:$(源)$(可执行) 为什么要将源放在依赖项中 “.cpp.o:” 为什么不写“.o:.cpp” CC=g++ CFLAGS=-c-墙 LDFLAGS= SOURCES=main.cpp hello.cpp factorial.cpp 对象=$(源:.cpp=.o) 可执行文件=你好 全部:$(源)$(可执行) $(可执行文件):$(对象) $(CC)$(LDFLAGS)$(对象)-o$@ .cpp.o: $(CC)$(CFLAGS)$就不难了

这是一个简单的makefile

我有两个问题

  • 全部:$(源)$(可执行) 为什么要将源放在依赖项中
  • “.cpp.o:” 为什么不写“.o:.cpp”

    CC=g++
    CFLAGS=-c-墙
    LDFLAGS=
    SOURCES=main.cpp hello.cpp factorial.cpp
    对象=$(源:.cpp=.o)
    可执行文件=你好
    全部:$(源)$(可执行)
    $(可执行文件):$(对象)
    $(CC)$(LDFLAGS)$(对象)-o$@
    .cpp.o:
    $(CC)$(CFLAGS)$<-o$@
    

  • all
    $(源代码)
    的依赖性不是必需的,甚至不是有用的。依赖关系信息应确保可执行文件依赖于目标文件,而目标文件依赖于源文件

    符号:

    .cpp.o:
    
    原版(第7版)是这样的吗™)
    make
    版本处理了编译规则。GNU make(和Sun make)使用了
    %
    符号来允许:

    %.o: %.cpp
    

    基本上,这在当时是一个有意义的设计决策,回顾起来可能没有那么有意义。这不是最严重的问题(即命令行开头的选项卡)。

    如果源代码未作为依赖项包含,则运行“全部生成”修改源文件后,将导致无法重新编译可执行文件。.cpp.o:是一种旧式后缀规则,表示可以通过运行后续命令将扩展名为.cpp的文件转换为.o版本的文件。关于GNU make老式后缀规则还有更深入的信息。制表符有什么问题,除了新手有时会忘记它们之外?几乎所有其他地方都不知道空格的内容。更重要的是,它实际上没有提供多少有用的服务,AFAICT。
    makefile的解析器如果在命令行的开头允许任意空白,ode>就不难了。因此,它给用户(尤其是初学者)造成了一个障碍,这其实是不必要的。
    
    %.o: %.cpp