2017-04-20 63 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