【问题标题】:Makefile - Compile object with different libraryMakefile - 使用不同的库编译对象
【发布时间】:2020-05-13 16:31:30
【问题描述】:

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

【问题讨论】:

  • 我看到错误消息指的是您的 Makefile 的第 37 和 41 行......但是您提供的 Makefile 的行数比这少吗?请发布错误消息附带的 Makefile。
  • 我只是将我认为问题所在的部分代码发送给它。
  • ...贬低错误信息,让我们猜测。
  • 按规矩办事:Include just enough code to allow others to reproduce the problem. For help with this, read How to create a Minimal, Complete, and Verifiable example.
  • 不,你没有。 “重现问题”是指提供错误消息重现错误消息所需的代码。这就是我想告诉你的。该错误消息包含两个行号,非常重要的信息指出了问题所在 - 如果您拥有具有匹配行的 Makefile。

标签: c makefile clang


【解决方案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')

【讨论】:

  • 谢谢。这就是问题所在。我非常专注于尝试执行 2 条规则,以至于我没有看到这一点。谢谢你的“信息”提示,不知道这个命令。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-27
  • 1970-01-01
相关资源
最近更新 更多