0
所以,我可以理解这里存在的问题,但我无法弄清楚如何解决它 - 因为它是从不同的目录编译文件, .a库文件和可执行文件放入根目录中......看起来,makefile期望它们位于它们的源目录中,这就是为什么即使没有进行任何更改也能重新构建的原因。Makefile - 在没有更改时编译库和可执行文件
问题是,我的学校对文件夹结构非常严格,所以它需要编译到底是怎么回事,我只需要弄清楚如何让makefile知道可执行文件和库文件是否存在,在根目录下。
这里是我的Makefile:
NAME = fillit
LIB = libft.a
CC = gcc
CFLAGS = -Wall -Wextra -Werror
RM = /bin/rm -rf
SRC = main.c validation.c create_piece.c game_board.c solver.c tables.c \
trimmer.c
LIBSRC = ft_putchar.c ft_putstr.c ft_strcpy.c ft_strnew.c ft_strdel.c \
ft_strequ.c ft_putendl.c ft_error.c
LIBLIST := $(shell ls -1 libft | grep .c$$)
LIBOBJ := $(LIBLIST:.c=.o)
LIBOBJ := $(addprefix libft/, $(LIBOBJ))
SRCLIST := $(shell ls -1 src | grep .c$$)
SRCOBJ := $(SRCLIST:.c=.o)
SRCOBJ := $(addprefix src/, $(SRCOBJ))
.PHONY: all $(NAME) lib
all: $(NAME)
libft/%.o: libft/%.c
$(CC) $(CFLAGS) -c -o [email protected] $<
src/%.o: src/%.c
$(CC) $(CFLAGS) -c -o [email protected] $<
lib:
ar rc $(LIB) $(LIBOBJ)
ranlib $(LIB)
debug:
$(CC) $(CFLAGS) $(addprefix libft/, $(LIBLIST)) $(addprefix src/, $(SRCLIST)) -g -o fillit
$(NAME): $(LIBOBJ) $(SRCOBJ) lib
$(CC) $(CFLAGS) $(SRCOBJ) -L. -lft -o fillit
clean:
$(RM) $(SRCOBJ)
$(RM) $(LIBOBJ)
fclean: clean
$(RM) $(NAME)
$(RM) $(LIB)
re: fclean all
re-db: fclean debug
它的正常工作编译.o文件,它不仅是一次,但如果我继续键入make,它仍然编译此部分:
➜ fillit git:(master) ✗ make
ar rc libft.a libft/ft_memset.o libft/ft_putchar.o libft/ft_putendl.o libft/ft_putstr.o libft/ft_strcpy.o libft/ft_strdel.o libft/ft_strequ.o libft/ft_strnew.o
ranlib libft.a
gcc -Wall -Wextra -Werror src/create_piece.o src/game_board.o src/main.o src/solver.o src/tables.o src/trimmer.o src/validation.o -L. -lft -o fillit
您的'lib'目标没有依赖关系,因此它始终运行。 – kaylum
以及正在执行的可执行文件如何? –
那么,它依赖于总是需要重建的lib,导致exec目标总是被重建。 – kaylum