2017-04-20 4 views
0

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 
+3

Ihr 'lib' Ziel hat keine Abhängigkeiten, so dass es immer ausgeführt wird. – kaylum

+0

und was ist mit der ausführbaren Datei noch gemacht werden? –

+0

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

Antwort

0

Willst du kaylum dafür danken, dass du mich in die richtige Richtung gelenkt hast, habe ich herausgefunden, wie ich dieses Problem lösen kann. Ich habe lib zu $(LIB) geändert und $ (NAME) und lib von der falschen Liste entfernt. Arbeiten 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 
Verwandte Themen