【发布时间】: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