Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 使用Makefile编译:如何为几个程序正确编译?_C_Makefile_Compilation - Fatal编程技术网

C 使用Makefile编译:如何为几个程序正确编译?

C 使用Makefile编译:如何为几个程序正确编译?,c,makefile,compilation,C,Makefile,Compilation,我正在学习如何使用Makefile编译。 我想我已经理解了这个工具的目的,但是我面临一个问题。 我正在做一个项目,需要用同一个Makefile编译几个程序。 我的程序基于相同的练习,但它们必须显示不同的内容,这就是我需要五个不同输出程序的原因。 但是它们使用相同的函数,相同的main.c文件,等等。 我想找到最好的编译方法,而不是编译我的程序所共有的文件的五倍。我希望我的句子是可以理解的。。。 这是我的Makefile: NAME0 = colle-00 NAME1 = colle-01 NAM

我正在学习如何使用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文件进行了修改,才有可能编译这些文件,但我不确定这是否是隐藏在避免重新链接背后的想法


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

我认为,你可以简单地做:

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

%.o:%.c模式替换用于生成对象文件。请注意,如果头文件发生更改,则不会重新生成对象文件。因此,要实现这种行为,您可以检查。

完全正确!相同的ft_uuu,相同的main.c和五种不同的方式显示colle_uuu.c文件管理的结果。非常感谢。利用你的想法,我解决了这个问题,你帮助我回答了关于潜在重新链接问题的问题。你的想法很聪明,我只是很失望,因为我可以自己解决这个问题。。。但有时这个想法只想来自另一个人:非常感谢!!!