So kann ich verstehen, was das Problem hier ist, aber ich kann nicht ganz herausfinden, wie es zu beheben - Weil es Dateien aus einem anderen Verzeichnis kompiliert, aber werfen Die .a-Bibliotheksdatei und die ausführbare Datei im Stammverzeichnis ... Es scheint, dass das Makefile erwartet, dass sie sich in ihrem Quellverzeichnis befinden, und deshalb wird es jedes Mal neu erstellt, auch wenn keine Änderungen vorgenommen werden.Makefile - kompilieren Bibliothek und ausführbare wenn keine Änderungen gemacht
Problem ist, meine Schule ist sehr streng auf Ordnerstruktur, so muss es genau zu kompilieren, wie es ist, ich muss nur herausfinden, wie das Makefile wissen, die ausführbare Datei und Bibliothek DO existieren, im Stammverzeichnis .
Hier ist meine 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
Es ist die .o Dateien feine Arbeiten, für die Erstellung es nicht nur, dass einmal, aber wenn ich weiterhin machen geben, es kompiliert noch dieser Teil:
➜ 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
Ihr 'lib' Ziel hat keine Abhängigkeiten, so dass es immer ausgeführt wird. – kaylum
und was ist mit der ausführbaren Datei noch gemacht werden? –
Nun, es hängt von der lib ab, die immer neu erstellt werden muss, was dazu führt, dass das exec-Ziel immer neu aufgebaut wird. – kaylum