我正在尝试创建一个构建库并编译文件的Makefile。我的问题是,根据 %.c 文件,我需要使用不同的库进行编译。
SRC_MLX需要$(LFLAGS(,而SRC不需要。所以 gcc 编译器不允许我使用 LFLAGS 编译 SRC。这就是我需要分开的原因。
我试过这种方式:
SRCS = $(DIR_SRC)/ft_utils.c
$(DIR_SRC)/ft_adt.c
$(DIR_SRC)/ft_circle.c
$(DIR_SRC)/ft_line.c
$(DIR_SRC)/ft_trgb.c
$(DIR_SRC)/ft_quadrilateral.c
$(DIR_SRC)/ft_player.c
$(DIR_SRC)/ft_color.c
SRCS_MLX = $(DIR_SRC)/win_update.c
$(DIR_SRC)/ft_vars.c
$(DIR_SRC)/ft_image.c
$(DIR_SRC)/ft_map.c
$(NAME): $(LIB_NAME)
$(CC) $(CFLAGS) main.c -I. -I$(DIR_MLX) -L$(DIR_MLX) -L. $(LFLAGS) $(LIB_FLAG) -o $@ -g
$(DIR_OBJ)/$(OBJ).o: $(DIR_SRC)/$(SRCS).c
mkdir -p $(DIR_OBJ)
$(CC) $(CFLAGS) -c $< -I. -I$(DIR_MLX) -o $@
$(DIR_OBJ)/$(OBJ_MLX).o: $(DIR_SRC)/$(SRCS_MLX).c
mkdir -p $(DIR_OBJ)
$(CC) $(CFLAGS) -c $< -I. -I$(DIR_MLX) -L$(DIR_MLX) $(LFLAGS) -o $@
$(LIB_NAME): $(OBJ_MLX) LIB_OBJ
$(AR) $(LIB_NAME) $(OBJ)
ranlib $(LIB_NAME)
LIB_OBJ: $(OBJ)
$(AR) $(LIB_NAME) $(OBJ)
在上面的示例中,我尝试使用一种文件创建一个库,然后使用第一个库和其他文件创建一个库。但是我不断收到此错误:
Makefile:41: warning: overriding recipe for target '.objs/'
Makefile:37: warning: ignoring old recipe for target '.objs/'
make: Warning: File 'Makefile' has modification time 454 s in the future
rm -f .objs/ft_utils.o .objs/ft_adt.o .objs/ft_circle.o .objs/ft_line.o .objs/ft_trgb.o .objs/ft_quadrilateral.o .objs/ft_player.o .objs/ft_color.o
rm -f libcub3d.a
rm -f main
make: *** No rule to make target 'src/src/win_update.c', needed by '.objs/win_update.o'. Stop.
如何使用不同的库编译此对象?
附言这些是我的变量:
DIR_OBJ = .objs
DIR_SRC = src
DIR_LIB = lib
DIR_MLX = ./minilibx-linux
NAME = main
LIB_NAME = libcub3d.a
OBJ = $(patsubst $(DIR_SRC)/%.c, $(DIR_OBJ)/%.o, $(SRCS))
OBJ_MLX = $(patsubst $(DIR_SRC)/%.c, $(DIR_OBJ)/%.o, $(SRCS_MLX))
CC = clang
CFLAGS = -Wall -Werror -Wextra
LFLAGS = -lmlx -lm -lX11 -lXext -lbsd
LIB_FLAG = -lcub3d
AR = ar -rc
RM = rm -f
这些行绝对是不对的:
$(DIR_OBJ)/$(OBJ).o: $(DIR_SRC)/$(SRCS).c
...
$(DIR_OBJ)/$(OBJ_MLX).o: $(DIR_SRC)/$(SRCS_MLX).c
以及您定义SRCS
和SRCS_MLX
的方式以及这些:
OBJ = $(patsubst $(DIR_SRC)/%.c, $(DIR_OBJ)/%.o, $(SRCS))
OBJ_MLX = $(patsubst $(DIR_SRC)/%.c, $(DIR_OBJ)/%.o, $(SRCS_MLX))
只需在脑海中展开规则中的变量,或者要求 make 使用info
函数为您扩展它,您会发现它绝对不正确:
$(info output is '$(DIR_OBJ)/$(OBJ).o: $(DIR_SRC)/$(SRCS).c')