我必须在各个项目中遵循文件夹结构:
myproject/
obj/
src/
file1.c
file2.c
file3.c
inc/
myproject.h
Makefile
我有以下Makefile:
NAME := myproject
CC := gcc
RM := rm
CFLAGS := -Wall -Wextra -Werror
LDFLAGS := -Wall
RMFLAGS := -f
SRCDIR := src
OBJDIR := obj
INCDIR := inc
HEADERS := $(INCDIR)/myproject.h
LINK.o := $(CC) $(LDFLAGS)
COMPILE.c := $(CC) -I$(INCDIR) $(CFLAGS) -c
SRCS := file1.c file2.c file3.c
SOURCES := $(addprefix $(SRCDIR)/, $(SRCS))
OBJECTS := $(patsubst $(SRCDIR)/%.c, $(OBJDIR)/%.o, $(SOURCES))
$(OBJDIR)/%.o: $(SRCDIR)/%.c
$(COMPILE.c) $< -o $@
all: $(NAME)
$(NAME): $(OBJECTS) $(HEADERS) Makefile
$(LINK.o) $< -o $@
clean:
$(RM) $(OBJECTS)
fclean: clean
$(RM) $(NAME)
re: fclean all
.PHONY: all clean fclean re
以下是我希望实现的目标:
- 我想将所有.o文件放在obj/下。
- 最终的可执行文件应该位于myproject/文件夹的根目录下。
- 如果.c文件发生更改,则只应重新编译此文件。
- 如果Makefile或.h发生更改,我希望重新编译所有内容。
然而,当我运行这个Makefile时,我得到了myproject'. Stop.
所需要的make: *** No rule to make target
obj/file1.o '。
有谁能帮我修复这个Makefile,并给予我如何改进它的建议吗?
EDIT这里是基于注解的Makefile的新版本。
NAME := myproject
CC := gcc
RM := rm
CFLAGS := -Wall -Wextra -Werror
LDFLAGS := -Wall
RMFLAGS := -f
SRCDIR := src
OBJDIR := obj
INCDIR := inc
HEADERS := $(INCDIR)/myproject.h
LINK.o := $(CC) $(LDFLAGS)
COMPILE.c := $(CC) -I$(INCDIR) $(CFLAGS) -c
REMOVE := $(RM) $(RMFLAGS)
SRCS := file1.c file2.c file3.c
SOURCES := $(addprefix $(SRCDIR)/, $(SRCS))
OBJECTS := $(patsubst $(SRCDIR)/%.c, $(OBJDIR)/%.o, $(SOURCES))
$(OBJDIR)/%.o: $(SRCDIR)/%.c
$(COMPILE.c) $< -o $@
all: $(NAME)
$(NAME): $(OBJECTS)
$(LINK.o) -o $(NAME) $^
clean:
$(REMOVE) $(OBJECTS)
fclean: clean
$(REMOVE) $(NAME)
re: fclean all
.PHONY: all clean fclean re
这个版本可以工作,但我仍然不确定如何触发Makefile的重新编译或.h更改。
1条答案
按热度按时间cotxawn71#
感谢@MadScientist和@HardcoreHenry,我已经修复了Makefile。以下是最终版本: