【问题标题】:Make cannot find target with wildcard pattern使找不到通配符模式的目标
【发布时间】:2013-12-19 18:08:07
【问题描述】:
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 byoutput/kernel.elf'。停下来。

经过反复试验,我设法缩小问题范围:如果我将目标修改为:

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

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

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

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

【问题讨论】:

    标签: c++ makefile wildcard target


    【解决方案1】:

    简短的回答是,你不能。在模式规则中,目标和先决条件之间的模式 (%) 必须相同(按字​​符串)。它不能表示“某种但不完全相同的东西”。

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

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

    【讨论】:

    • 叹息。我想这会是一件很可笑的事情。在这种情况下,我只需将目标文件放在与源文件相同的位置并查找链接。幸运的是,大多数现代 IDE 都知道如何从目录树中隐藏目标文件。
    • 我不确定这有多“荒谬”;如果它们不匹配,您认为 make 应该如何直觉这些路径是相关的?不管怎样,你不必把它们放在同一个目录中,你只需要使用同一个目录结构。即可以将source/file1.cpp的对象放入output/obj/file1.cpp.o,将source/subdirectory/file3.cpp的对象放入output/obj/subdirectory/file3.cpp.o;这很简单。您只是不能将两个对象都直接放入 same 目录中。
    猜你喜欢
    • 1970-01-01
    • 2020-07-12
    • 1970-01-01
    • 2013-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-03
    • 1970-01-01
    相关资源
    最近更新 更多