C语言 生成文件 - 使用不同的库编译对象



我正在尝试创建一个构建库并编译文件的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

以及您定义SRCSSRCS_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')

最新更新