linux - 令人困惑的 Makefile

标签 linux unix makefile directory

我刚看到这个 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 $<

这到底是做什么用的? “$<”的计算结果为 .c.o?我看到这是一个“后缀规则”,但它们的真正用途是什么?

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

为什么我们需要这部分?似乎所有的依赖关系都已经处理好了……?

最佳答案

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

  2. 这个:

    .co: ...

the old way编写隐式规则。现在我们会这样写:

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

关于linux - 令人困惑的 Makefile,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46269224/

相关文章:

linux - 如何更改 openwrt Makefiles 以仅生成一个图像

linux - awk:根据给定列的前 3 个不同值选择行

c - 主线程调用pthread_exit后,它变成了僵尸。出了什么问题吗?

python - 即使我安装了软件包,在 makefile 上构建 python 软件包时出错

c - 为程序员学习 C

mysql - 使用 DBD::mysql 时需要有关 perl 错误的帮助

c - 多个进程中的静态变量(信号)

linux - 找到所有拥有超过 N 个进程的用户并在 shell 中回显它们

sql - ORA-00054: 资源繁忙并使用指定的 NOWAIT 获取

c - Linux 内核链接