【发布时间】:2020-10-10 07:39:35
【问题描述】:
Teacher 给了我们这个 makefile 用于编译两个 C 文件并将对象存储到一个名为 object 的目录中。它可以很好地编译程序,但是它不会将它们的对象存储到目录中,甚至也不会创建目录。不知道该怎么做,真的需要一些帮助。
这是我的制作文件
CC = clang
CFLAGS = -g -Wall
OBJDIR = object
HDRS = $(wildcard *.h)
SRCS = $(wildcard *.c)
OBJS = $(addprefix $(OBJDIR)/, $(SRCS:.c=.o))
.PHONY: all
all: client server
# WARNING: must have a tab before each definition
$(OBJDIR)/client.o: client.c $(HDRS) $(OBJDIR)
$(CC) $(CFLAGS) -c client.c -o object/client.o
$(OBJDIR)/server .o: server.c $(HDRS) $(OBJDIR)
$(CC) $(CFLAGS) -c server.c -o object/server.o
$(OBJDIR)/%.o: %.c $(HDRS) $(OBJDIR)
$(CC) $(CFLAGS) -c $*.c -o object/$*.o
$(OBJDIR):
mkdir $(OBJDIR)
.PHONY: clean
clean:
rm -f $(TARGET) $(OBJS)
【问题讨论】:
-
与您的问题相切,包含
object的编译行应该改用$(OBJDIR)。 -
您的 makefile 没有构建
client或server的规则,因此它使用内置的默认规则。 -
$(OBJDIR)/server行上的 'server' 和 '.o' 之间可能不应该有空格。 -
关于:
mkdir $(OBJDIR)这可能由于多种不同的原因而失败。应该检查其'成功/失败状态/。由于您声明未创建子目录,因此显然失败了。至少使用`-v选项和--mode= value选项 -
关于宏,例如:
OBJDIR = object使用=会导致每次引用宏时都会重新评估它。建议使用::=,这样它们只被评估一次