我正在从我所遵循的学术课程中查看此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:
...
喜欢您绝对应该not
尝试从本课程中学习如何编写Makefile:-/。$<
扩展为第一个依赖项。 $^
全部包含了它们。如果目标具有多个依赖项(可能通过Makefile
中其他地方的单独依赖项声明),则$<
不会全部包含它们。那是否是[[incorrect