“使”找不到具有通配符模式的目标

Make cannot find target with wildcard pattern

本文关键字:通配符 模式 目标 找不到      更新时间:2023-10-16
CXXSRC            = $(shell find source -iname "*.cpp")
CXXSRCFN          = $(notdir $(CXXSRC))
CXXOBJ            = $(CXXSRCFN:%.s=output/obj/%.cpp.o)
OUTPUT            = output/kernel.elf

.PHONY: builduserspace clean all

all: $(OUTPUT)
    @$(QEMU) -vga std -serial file:"output/serialout.log" -m 20 -hda output/disk.img -rtc base=localtime

$(OUTPUT): $(CXXOBJ)
    # Linking object files...
    @$(LD) $(LDFLAGS) -o output/temp.elf output/obj/Start.s.o $(shell find output/obj -name "*.o" ! -name "Start.s.o") -Lgcc
    # Performing objcopy...
    @$(OBJCOPY) -O elf32-i386 output/temp.elf output/kernel.elf

%.cpp.o: %.cpp
    @echo $(notdir $<)
    @$(CXX) $(CXXFLAGS) -o $(notdir $@) $<

这就是生成文件。情况是这样的,想象一下这个目录结构:

output
|
|-- obj
source
|
|-- file1.cpp
|-- file2.cpp
|-- subdirectory
    |
    |-- file3.cpp

假设我在根文件夹(输出和源所在的位置)中运行 make。目标输出是 output/kernel.elf。

本质上,我希望文件夹"source"中的所有文件都编译为目标文件并放入文件夹 output/obj 中。

我设法使变量正确;CXXSRC 只是要编译的所有源文件的列表;CXXOBJ 是输出列表。

但是,make: * 没有规则将目标设为 output/obj/file.cpp.o', needed by output/kernel.elf'。 停。

经过一些试验和错误,我设法缩小了问题范围:如果我将目标修改为:

output/obj/%.cpp.o: source/subdirectory/%.cpp

工作正常(即它在我的树中的其他文件上出错,因为并非所有文件都在子目录中)

显然,这会破坏%通配符运算符的目的,那么我该如何解决这个问题呢?

谢谢。第一篇SO帖子,请放轻松(:

简短的回答是,你不能。 在模式规则中,目标和先决条件之间的模式(%)必须相同(字符串)。 它不能意味着"某种东西,但不完全一样"。

我认为从多个不同的目录编译源文件并将输出放入单个目录有点不愉快。 每次我看到这样做时,它都成为一个大问题(因为人们有时会使用相同的源文件名,然后你就搞得一团糟)。

如果你真的想这样做,别无选择,只能使用不同的源目录声明多个规则。 有一些方法可以在 makefile 中执行此操作,而无需手动编写它们,但它们更高级一些。