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

标签 c++ makefile

我正在尝试为 C++ 项目创建以下目录结构。

├── Project
├── Makefile
│   ├── build/
│   ├── src
│   │   ├── include/
│   │   ├── cpp/
│   │   loader.s
│   │   linker.ld

我还想将每个 .cpp 文件分别编译到 build 目录并链接到不同的目标。

我在使用通配符时遇到问题:

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)。正确的语法是什么?

最佳答案

您的 BUILD 变量设置为 ./build/,而 OBJ 中的目标文件以 build/ 开头>。扩展后的规则如下:

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

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

修复很简单,只需通过设置使 target 目标和先决条件中的前缀匹配:

BUILD = build/

关于c++ - GNU Make 通配符将每个文件分别编译到构建目录中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47719789/

相关文章:

c++ - 仿函数:将 std::function 包装在类中

c++ - 将构造函数参数传递给模板函数工厂

makefile - cmake cygwin make.exe错误

c++ - 如何为流式自写类编写用户定义的操纵器

c++ - 完全重写VMT(虚拟方法表)

c++ - 以编程方式将目录添加到 Windows PATH 环境变量

c++ - Gnu Makefile - 处理依赖项

testing - Gnu Makefile,编译应该失败

c++ - Makefile子目录递归

Makefile:配方中模式规则%的重用值