【问题标题】:Confusing Makefile令人困惑的 Makefile
【发布时间】:2018-02-26 09:30:50
【问题描述】:

我刚刚遇到了这个 makefile,这让我很困惑:

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

这些是让我困惑的部分:

LIBDIR = $(PROJECT_ROOT)/src/lib

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

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

这到底是做什么的? "$

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

为什么我们需要这部分?似乎所有依赖项都已处理...?

【问题讨论】:

    标签: linux unix makefile directory


    【解决方案1】:
    1. 是的,将lib/ 放在src/ 下看起来是一个糟糕的、违反直觉的设计。

    2. 这个:

      .co: ...

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

    %.o: %.c
        ...
    
    1. 这是一种稍微 Rube Goldberg(非常聪明但过于复杂)的自动依赖处理方式。因此,如果foo.c 包含#include bar.h 行,则此规则会将foo.o: bar.h 行附加到makefile 中。这实际上很重要。

    【讨论】:

      猜你喜欢
      • 2022-01-21
      • 2022-01-17
      • 1970-01-01
      • 1970-01-01
      • 2012-05-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-06
      相关资源
      最近更新 更多