此makefile示例是否正确?

问题描述 投票:2回答:2

我正在从我所遵循的学术课程中查看此Makefile示例,并且出现了一些疑问。希望您能够澄清它们。

((1)我想知道为什么需要$(SRCDIR)/%。o:%.c收据中的自动变量$ ^?仅仅$(CC) -c $< $(CFLAGS) $(LDFLAGS)就够了吗?

((2)关于%通配符,例如,如果我有./src/main.c,则$(SRCDIR)/%.o: %.c将转换为./src/main.o : ./src/main.c还是仅转换为./src/main.o : main.c?在第二种情况下,收到的收据不是错误的吗?$(CC) -c ./src/main.c $(CFLAGS) $(LDFLAGS)VS $(CC) -c main.c $(CFLAGS) $(LDFLAGS)

((3)另外,为什么需要-lpthread?它与makefile选项有关,还是仅意味着某些文件可能正在使用pthread库?我认为许多基本库已经存在于基本GNU工具链中。像往常一样先感谢。

NAME = myprog
CC = gcc
CFLAGS = -Wall -O3 -I $(INCDIR)
LDFLAGS = -lpthread -lm
SRCDIR = ./src
INCDIR = ./include
BINDIR = /usr/local/bin
SOURCES = $(SRCDIR)/main.c $(SRCDIR)/dummy_functions.c
OBJECTS = $(SOURCES:.c=.o)

all: $(NAME)

$(NAME): $(OBJECTS)
    $(CC) $^ -o $@ $(CFLAGS) $(LDFLAGS)

$(SRCDIR)/%.o: %.c
    $(CC) $^ -c $< $(CFLAGS) $(LDFLAGS)

clean:
...
c makefile
2个回答
2
投票

喜欢您绝对应该not

尝试从本课程中学习如何编写Makefile:-/。

1
投票

$<扩展为第一个依赖项。 $^全部包含了它们。如果目标具有多个依赖项(可能通过Makefile中其他地方的单独依赖项声明),则$<不会全部包含它们。那是否是[[incorrect

取决于其他情况,但是通常我会说这至少令人惊讶(如果您确实只想要第一个文件,则至少应在注释中注明)。
© www.soinside.com 2019 - 2024. All rights reserved.