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