Das ist mein Makefile:Ärger mit Makefile Kompilieren von Objekten und bewegen sie
.PHONY : clean fclean re $(LIB_PATH)
NAME = fillit
FLAGS = -Wall -Wextra -Werror
LIB_NAME = libft.a
LIB_DIR = ../libft/
LIB_PATH = $(LIB_DIR)$(LIB_NAME)
OBJ_DIR_NAME = objects
OBJ_DIR = $(OBJ_DIR_NAME)/
HEADER_DIR = ../libft/
SRC = main.c func1.c
OBJ = $(SRC:.c=.o)
all :
mkdir -p $(OBJ_DIR_NAME)
$(MAKE) $(NAME)
$(NAME): $(OBJ_DIR)$(OBJ) $(LIB_PATH)
gcc -o $(NAME) $(addprefix $(OBJ_DIR), $(OBJ)) -L$(LIB_DIR) -lft -I$(HEADER_DIR)
$(LIB_PATH):
$(MAKE) -C $(LIB_DIR) --no-print-directory
$(OBJ_DIR)%.o : %.c
gcc $(FLAGS) -I $(HEADER_DIR) -c $<
-mv $(@F) $(OBJ_DIR)
clean :
-rm $(addprefix $(OBJ_DIR), $(OBJ))
-rm -rv $(OBJ_DIR_NAME)
fclean : clean
-rm $(NAME)
$(MAKE) -C $(LIB_DIR) fclean --no-print-directory
re: fclean
make
Wenn ich machen, ich erwarte, dass die Regel $(OBJ_DIR)%.o : %.c
kompiliert die beiden Objekte (func1.c main.c) und verschieben Sie sie in Objekte Verzeichnis. Aber die Regel geschieht nur mit der ersten Quelldatei geschrieben in SRC
Ja war func1.c ich habe es schon entschuldigt. Sie sind im selben Verzeichnis und was ist mehr, wenn ich '$ (NAME) schreiben: $ (OBJ_DIR) main.o $ (OBJ_DIR) func1.o $ (LIB_PATH)' anstelle von '$ (NAME): $ (OBJ_DIR) $ (OBJ) $ (LIB_PATH) 'funktioniert perfekt. – latiagertrutis
Nun, es scheint, dass in '$ (OBJ_DIR) $ (OBJ)' das '$ (OBJ_DIR)' nur für die erste Datei in '$ (OBJ)' funktioniert, das bedeutet, dass 'main.o' perfekt aufgebaut ist, weil sein Pfad ist korrekt, aber 'func1.o' wird nicht erstellt, da der Pfad nicht hinzugefügt wurde und der Compiler denkt, dass sich die Datei im selben Verzeichnis wie das Makefile befindet. Versuchen Sie folgendes: 'OBJ = $ (patsubst% .c, $ (OBJ_DIR)% .o, $ (SRC)' anstelle von 'OBJ = main.o func1.o'. Und dann entfernen Sie auch das' $ (OBJ_DIR) ' aus der Zeile '$ (NAME): $ (OBJ_DIR) $ (OBJ) $ (LIB_PATH)'. –
Vielleicht müssen Sie einen Pfad zu den src-Dateien in '$ (patsubst)' hinzufügen, etwa so: 'OBJ = $ (patsubst $ (SRC_DIR)% .c, $ (OBJ_DIR)% .o, $ (SRC))', es hängt davon ab, wo sich Ihre src-Dateien befinden und weitere Informationen über patsubst finden Sie in [GNU Make Manual] (https://www.gnu.org/software/make/manual/html_node/Text-Functions.html#Text-Functions) Ich hoffe das hilft :) –