GNU Make通配符将每个文件分别编译到构建目录中

时间:2017-12-08 17:55:57

标签: c++ makefile

我正在尝试为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)。这是什么正确的语法?

1 个答案:

答案 0 :(得分:2)

BUILD变量设置为./build/OBJ中的目标文件设置为build/。扩展规则如下:

./build/kernel.elf: ./build/loader.o build/...
./build/%.o: ./src/%.s

额外的./前缀会影响make的规则匹配,因为路径未被规范化。

修复就像通过设置:

使目标目标和先决条件中的前缀匹配一样简单
BUILD = build/