【问题标题】:Makefile is not creating a directoryMakefile 没有创建目录
【发布时间】: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 没有构建 clientserver 的规则,因此它使用内置的默认规则。
  • $(OBJDIR)/server 行上的 'server' 和 '.o' 之间可能不应该有空格。
  • 关于:mkdir $(OBJDIR) 这可能由于多种不同的原因而失败。应该检查其'成功/失败状态/。由于您声明未创建子目录,因此显然失败了。至少使用`-v 选项和--mode= value 选项
  • 关于宏,例如:OBJDIR = object 使用= 会导致每次引用宏时都会重新评估它。建议使用::=,这样它们只被评估一次

标签: c unix makefile


【解决方案1】:

我所要做的就是将多个目标添加到 makefile 并将所有目标更改为目标

CC = clang
CFLAGS = -g -Wall 

# TODO: rename the target to something meaningful!
TARGET = client server

OBJDIR = object
HDRS = $(wildcard *.h)
SRCS = $(wildcard *.c)
OBJS = $(addprefix $(OBJDIR)/, $(SRCS:.c=.o))

.PHONY: all
all: $(TARGET)

# WARNING: *must* have a tab before each definition
$(TARGET): $(OBJDIR) $(OBJS)
    $(CC) $(CFLAGS) $(OBJDIR)/protocol.o $(OBJDIR)/$@.o  -o $@

$(OBJDIR)/%.o: %.c $(HDRS) $(OBJDIR)
    $(CC) $(CFLAGS) -c $*.c -o object/$*.o

$(OBJDIR):
    mkdir $(OBJDIR)

.PHONY: clean
clean:
    rm -f $(TARGET) $(OBJS)

【讨论】:

    猜你喜欢
    • 2021-05-19
    • 2020-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多