首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >令人困惑的Makefile

令人困惑的Makefile
EN

Stack Overflow用户
提问于 2017-09-18 05:54:45
回答 1查看 96关注 0票数 0

我偶然发现了这个makefile,它让我感到困惑:

代码语言:javascript
复制
PROJECT_ROOT = ../..

LIBDIR = $(PROJECT_ROOT)/src/lib

INCDIR = $(PROJECT_ROOT)/include

SRCS = proj_start.c  function1.c
LIBS = $(LIBDIR)/libtest.a

OBJS = $(SRCS:.c=.o)
PROJECT = project1
FLAGS = -I$(INCDIR)
CC = gcc $(FLAGS)

.c.o:
        $(CC) -c $<

$(PROJECT): $(OBJS)
        $(CC) $(OBJS) $(LIBS) -o $@

it: $(PROJECT)

clean:
        rm -f $(OBJS) $(PROJECT)

depend: $(SRCS)
        $(CC) -M $(SRCS) > dependList
        sed -e '1,/^# DO NOT DELETE/!d' Makefile > make.tmp
        cat dependList >> make.tmp
        mv make.tmp Makefile
        rm dependList

# DO NOT DELETE THIS LINE

以下是让我感到困惑的部分:

代码语言:javascript
复制
LIBDIR = $(PROJECT_ROOT)/src/lib

为什么LIBDIR在根目录/src/lib库中?它不应该是根/lib目录(这两个目录都存在于文件层次结构中)吗?

代码语言:javascript
复制
.c.o:
        $(CC) -c $<

这到底是做什么的?"$<“的计算结果是.c.o?我知道这是一个“后缀规则”,但它们到底是用来做什么的?

代码语言:javascript
复制
depend: $(SRCS)
        $(CC) -M $(SRCS) > dependList
        sed -e '1,/^# DO NOT DELETE/!d' Makefile > make.tmp
        cat dependList >> make.tmp
        mv make.tmp Makefile
        rm dependList

# DO NOT DELETE THIS LINE

为什么我们需要这个部分?看起来所有的依赖关系都已经被处理了...?

EN

回答 1

Stack Overflow用户

发布于 2017-09-18 10:08:38

  1. 是的,将lib/放在src/之下看起来是一个糟糕的、违反直觉的设计。
  2. 如下:

.c.o:...

是编写隐式规则的the old way。这些天我们会这样写:

代码语言:javascript
复制
%.o: %.c
    ...

  1. 它有点像Rube Goldberg (i.r.聪明但过于复杂)进行自动依赖处理的方式。因此,如果foo.c包含行#include bar.h,则此规则会将行foo.o: bar.h附加到makefile。这实际上很重要。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46269224

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档