C语言 如何为具有相同文件夹结构的不同项目生成通用Makefile?

iaqfqrcu  于 2023-01-25  发布在  其他
关注(0)|答案(1)|浏览(113)

我必须在各个项目中遵循文件夹结构:

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更改。

cotxawn7

cotxawn71#

感谢@MadScientist和@HardcoreHenry,我已经修复了Makefile。以下是最终版本:

# Edit the $(NAME) and $(SRCS) variables as necessary.
NAME        :=  myprogram
SRCS        :=  file1.c file2.c file3.c

CC          :=  gcc
RM          :=  rm

CFLAGS      :=  -Wall -Wextra -Werror
LDFLAGS     :=  -Wall
RMFLAGS     :=  -f

SRCDIR      :=  src
OBJDIR      :=  obj
INCDIR      :=  inc

# Edit the $(HEADERS) variable as necessary.
HEADERS     :=  $(INCDIR)/myprogram.h

LINK.o      :=  $(CC) $(LDFLAGS)
COMPILE.c   :=  $(CC) -I$(INCDIR) $(CFLAGS) -c
REMOVE      :=  $(RM) $(RMFLAGS)

SOURCES     :=  $(addprefix $(SRCDIR)/, $(SRCS))
OBJECTS     :=  $(patsubst $(SRCDIR)/%.c, $(OBJDIR)/%.o, $(SOURCES))

$(OBJDIR)/%.o: $(SRCDIR)/%.c
    @mkdir -p $(@D)
    $(COMPILE.c) $< -o $@

all: $(NAME)

$(OBJECTS): $(HEADERS) Makefile

$(NAME): $(OBJECTS)
    $(LINK.o) -o $(NAME) $^

clean:
    $(REMOVE) $(OBJECTS)

fclean: clean
    $(REMOVE) $(NAME)

re: fclean all

.PHONY: all clean fclean re

相关问题