I'm new to Makefiles, so far I've only been doing little projects, but I just did my biggest project with 20 *.c files and put them all in a src file.
With my Makefile I wanted to create an obj file with all the corresponding *.o files and then make them all into an executable. I heard about Static Patterns and I tried to use it on my makefile but I'm probably making a very silly mistake as the output is not what I expected.
My Makefile:
CC=gcc
CFLAGS=-Wall -Wextra -Werror
MLX=mlx/libmlx_Darwin.a
LIBFT=libft/libft.a
I_LIBFT=-Ilibft -Llibft -lft
I_LIBMLX=-Imlx -Lmlx -lmlx
LIB=$(I_LIBFT) $(I_LIBMLX)
COMPATIBILITY=-lX11 -lXext
FRAMEWORK=-framework OpenGL -framework AppKit
HDR=/include/fdf.h
SRC_DIR=/src/
SRCS:=$(wildcard $(SRC_DIR)*.c)
OBJ_DIR=/obj/
OBJS=$(patsubst %.c, $(OBJ_DIR)%.o, $(SRCS))
all: $(LIBFT) app
$(LIBFT):
make -C libft
@echo "done libft"
$(OBJ_DIR):
mkdir $@
$(OBJS): $(OBJ_DIR)%.o: $(SRC_DIR)%.c $(OBJ_DIR)
$(CC) $(CFLAGS) -c $< -o $@
app: $(OBJS)
@echo "making app"
$(CC) $(CFLAGS) $(LIB) $(FRAMEWORK) $(OBJS) -o FdF
clean:
make -C libft $@
fclean: clean
make -C libft $@
re: fclean all
.PHONY: all clean fclean re so
My output:
making app
gcc -Wall -Wextra -Werror -Ilibft -Llibft -lft -Imlx -Lmlx -lmlx -framework OpenGL -framework AppKit -o FdF
Undefined symbols for architecture arm64:
"_main", referenced from:
implicit entry/start for main executable
ld: symbol(s) not found for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [app] Error 1
when I expected something like:
gcc -Wall -Wextra -Werror -c file.c -o file.o
gcc -Wall -Wextra -Werror -c file2.c -o file2.o
gcc -Wall -Wextra -Werror -c file3.c -o file3.o
...
gcc -Wall -Wextra -Werror -Ilibft -Llibft -lft -Imlx -Lmlx -lmlx -framework OpenGL -framework AppKit file.o file2.o ... file19.o -o FdF
What am I doing wrong?