2017-04-20 77 views
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 
+3

您的'lib'目標沒有依賴關係,因此它始終運行。 – kaylum

+0

以及正在執行的可執行文件如何? –

+0

那麼,它依賴於總是需要重建的lib,導致exec目標總是被重建。 – kaylum

回答

0

想要感謝kaylum指點我正確的方向,我已經想出瞭如何解決這個問題。我將lib更改爲$(LIB),並從假冒列表中刪除了$(NAME)和lib。正在運行的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 

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 $(NAME) 

clean: 
    $(RM) $(SRCOBJ) 
    $(RM) $(LIBOBJ) 


fclean: clean 
    $(RM) $(NAME) 
    $(RM) $(LIB) 

re: fclean all 

re-db: fclean debug