使用Makefile进行编译:如何对几个程序正确执行?

时间:2018-07-21 17:17:51

标签: c makefile compilation

我正在学习如何使用Makefile进行编译。 我认为我已经了解了该“工具”的目的,但是我面临一个问题。 我正在做一个项目,需要用同一Makefile编译几个程序。 我的程序基于同一练习,但是它们必须显示不同的内容,这就是为什么我需要五个不同的“输出程序”的原因。 但是它们使用相同的功能,相同的main.c文件等。 我想找到一种最佳的编译方式,而无需编译程序通用文件的五倍。我希望我的句子可以理解... 这是我的Makefile:

NAME0 = colle-00
NAME1 = colle-01
NAME2 = colle-02
NAME3 = colle-03
NAME4 = colle-04

SRC0 = srcs/colle_00.c
SRC1 = srcs/colle_01.c
SRC2 = srcs/colle_02.c
SRC3 = srcs/colle_03.c
SRC4 = srcs/colle_04.c

OBJ0 = colle_00.o
OBJ1 = colle_01.o
OBJ2 = colle_02.o
OBJ3 = colle_03.o
OBJ4 = colle_04.o

HDR = includes/my.h

SRCALL = srcs/ft_atoi.c \
     srcs/ft_putchar.c \
     srcs/main.c \
     srcs/ft_print_line.c

SRCALLO = ft_atoi.o \
      ft_putchar.o \
      main.o \
      ft_print_line.o

FLAGS = -Wall -Werror -Wextra

all: $(NAME0) $(NAME1) $(NAME2) $(NAME3) $(NAME4)

$(NAME0):
    cc $(FLAGS) -I $(HDR) -c $(SRC0) $(SRCALL)
    cc $(OBJ0) $(SRCALLO) -o $(NAME0)
$(NAME1):
    cc $(FLAGS) -I $(HDR) -c $(SRC1) $(SRCALL)
    cc $(OBJ1) $(SRCALLO) -o $(NAME1)
$(NAME2):
    cc $(FLAGS) -I $(HDR) -c $(SRC2) $(SRCALL)
    cc $(OBJ2) $(SRCALLO) -o $(NAME2)
$(NAME3):
    cc $(FLAGS) -I $(HDR) -c $(SRC3) $(SRCALL)
    cc $(OBJ3) $(SRCALLO) -o $(NAME3)
$(NAME4):
    cc $(FLAGS) -I $(HDR) -c $(SRC4) $(SRCALL)
    cc $(OBJ4) $(SRCALLO) -o $(NAME4)

clean:
    rm -f *.o

fclean: clean
    rm -f $(NAME0) $(NAME1) $(NAME2) $(NAME3) $(NAME4)

re: fclean all

我认为我有一个重新链接问题,但是我很难理解如何解决此问题...我认为只有在自创建相应的.o之后对其进行了修改的情况下,才可以编译.c文件。文件,但是我不确定这是“避免重新链接”背后隐藏的想法。

非常感谢您花时间回答我的问题!

1 个答案:

答案 0 :(得分:1)

我认为,您可以轻松做到:

$(NAME0): $(SRCALLO)
    cc $(FLAGS) -I $(HDR) -c $(SRC0)
    cc $(OBJ0) $(SRCALLO) -o $(NAME0)
$(%.o):$(%.c)

“%。o:%。c”模式替换,用于生成目标文件。注意,如果更改头文件,则不会重新生成目标文件。因此,要实现这种行为,您可以检查How can I have a Makefile automatically rebuild source files that include a modified header file? (In C/C++)