【问题标题】:Why does this makefile fails when I remove the vpath directive?为什么当我删除 vpath 指令时这个 makefile 会失败?
【发布时间】:2020-02-27 10:49:33
【问题描述】:

我正在玩弄 GNU GCC makefile,并制作了这个简单的文件来构建“Hello, world!”。程序。

CC=gcc
SOURCES=./Source/main.c
BUILD_DIR=./Build
TARGET=main

all: $(BUILD_DIR)/$(TARGET).exe

OBJECTS = $(addprefix $(BUILD_DIR)/,$(notdir $(SOURCES:.c=.o)))
vpath %.c $(sort $(dir $(SOURCES)))

$(BUILD_DIR)/%.o: %.c
    $(CC) -c $< -o $@

$(BUILD_DIR)/%.exe: $(OBJECTS)
    $(CC) $< -o $@

当我删除或评论这一行时,我不明白为什么 vpath %.c $(sort $(dir $(SOURCES))),make 停止并返回此错误:


> Executing task: D:\Servers\Compilers\MinGW\bin\mingw32-make.exe GCC_PATH=D:\Servers\Compilers\gcc-arm-none-eabi\bin <

mingw32-make: *** No rule to make target 'Build/main.exe', needed by 'all'.  Stop.

你能解释一下为什么吗?

【问题讨论】:

  • --debug 传递给make 以查看更多信息。
  • 我已经这样做了,但仍然没有找到有用的信息

标签: c gcc gnu-make


【解决方案1】:

您在目标文件中添加了前缀,因此您的 OBJECTS 为“./Build/main.o”。
但是当你使用静态规则时,'.o'后缀将被'.c'替换,所以你的OBJECTS是./Build/main.c。你的main.c不在“Build”目录中,所以它肯定失败了。当你添加vpath %.c $(sort $(dir $(SOURCES)))时,它会自动从Build目录中找到.c文件。

【讨论】:

  • 这是几乎正确的。但是 make 永远不会查看Build;你的模式是$(BUILDDIR)/%.o : %.c。如果BUILDDIRBuild,那么当make 尝试构建目标Build/foo.o 时,先决条件是foo.c(不是Build/foo.c)。其余的就像你说的那样:foo.c 不存在,所以你需要使用vpath 告诉 make 去哪里寻找它。
  • 非常感谢你们!我没有注意到这一点
猜你喜欢
  • 1970-01-01
  • 2021-09-13
  • 2018-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-15
  • 1970-01-01
相关资源
最近更新 更多