“使”找不到具有通配符模式的目标
Make cannot find target with wildcard pattern
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 中执行此操作,而无需手动编写它们,但它们更高级一些。
相关文章:
- 表示"accepting anything for this template argument" C++概念的通配符
- 当使用通配符和null指针调用函数时,对输出的说明
- C++17 文件系统::remove_all 带有通配符路径
- 如何允许通配符模板参数
- 使用通配符的跨平台文件列表
- 如何检索由带通配符的字符串索引的对象
- 有效地查找通配符条目
- 具有不同输入和输出名称的生成文件通配符
- MinGW GCC通配符编译所有文件(Windows)
- Windows 上带有通配符的目录中的文件
- 查找第一个文件W通配符匹配
- 在某些情况下,通配符模式匹配失败
- 实现通配符后没有输入文件错误
- 如何为文件对话框过滤器设置通配符
- 使用通配符搜索QTableWidget时出现问题
- 为什么 std::experimental::filesystem::p ath 不接受像 "*" 这样的通配符?
- 在三元搜索树中搜索(NOT with)通配符
- SQLite如何在列上使用LIKE并添加通配符
- “使”找不到具有通配符模式的目标
- 通配符模式匹配中的分割错误