Makefile - 用不同的库编译对象。

问题描述 投票:0回答:1

我正试图创建一个Makefile来构建一个类库并编译文件,我的问题是,根据%.c文件,我需要用不同的类库来编译。我的问题是,根据%.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.

我怎么能用不同的lib编译这个对象?

P.S. 这些是我的变量。

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
c makefile clang
1个回答
1
投票

这几行肯定是不对的。

$(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')
© www.soinside.com 2019 - 2024. All rights reserved.