我正在尝试为C ++项目创建以下目录结构。
├── Project
├── Makefile
│ ├── build/
│ ├── src
│ │ ├── include/
│ │ ├── cpp/
│ │ loader.s
│ │ linker.ld
我还想将每个.cpp
文件分别编译到构建目录中,并链接到另一个目标。
我在使用通配符时遇到问题:
BUILD = ./build/
OBJS = $(patsubst src/cpp/%.cpp,build/%.o,$(wildcard src/cpp/*.cpp))
CPPFLAGS = -I ./src/include -Wfatal-errors -fno-use-cxa-atexit -nostdlib -fno-builtin -fno-rtti -fno-exceptions -fno-leading-underscore
$(BUILD)kernel.elf: $(BUILD)loader.o $(OBJS)
$(ARMGNU)-ld -T ./src/linker.ld -o $@ $^
$(ARMGNU)-objdump -D $(BUILD)kernel.elf > $(BUILD)kernel.list
$(BUILD)%.o: ./src/%.s
$(ARMGNU)-as $(AFLAGS) -c -o $@ $^
$(BUILD)%.o: ./src/cpp/%.cpp
$(ARMGNU)-gcc $(CPPFLAGS) -c -o $@ $^
永远不会构建build/%.o
,因此链接步骤为空$(OBJS)
。这是什么正确的语法?
答案 0 :(得分:2)
BUILD
变量设置为./build/
,OBJ
中的目标文件设置为build/
。扩展规则如下:
./build/kernel.elf: ./build/loader.o build/...
./build/%.o: ./src/%.s
额外的./
前缀会影响make
的规则匹配,因为路径未被规范化。
修复就像通过设置:
使目标目标和先决条件中的前缀匹配一样简单BUILD = build/