Makefile - 未进行任何更改时编译库和可执行文件

时间:2017-04-20 20:57:02

标签: c gcc makefile

所以,我可以理解这里的问题是什么,但我无法弄清楚如何修复它 - 因为它是从不同的目录编译文件,但是将.a库文件和可执行文件放到根目录中...似乎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 $@ $<

src/%.o: src/%.c
    $(CC) $(CFLAGS) -c -o $@ $<

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

1 个答案:

答案 0 :(得分:1)

要感谢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 $@ $<

src/%.o: src/%.c
    $(CC) $(CFLAGS) -c -o $@ $<

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