【问题标题】:Recursive Makefile to build .o files用于构建 .o 文件的递归 Makefile
【发布时间】:2018-03-21 15:46:09
【问题描述】:

我正在编写一个简单的内核,到目前为止一切顺利。 我正在使用 Makefile 通过 shell 构建系统。 但是,我希望移动和重组文件结构,但是我的 makefile 使用绝对链接。 如何重构它以将所有 .cpp/.c 文件和 .s 文件编译到 out 文件夹并链接它们,而无需定义每个文件夹路径?

CC = ~/opt/cross/bin/i386-elf-g++
AS = ~/opt/cross/bin/i386-elf-as
LNFLAGS = -T linker.ld -melf_i386
CCFLAGS = -c -ffreestanding -nostdlib -fno-builtin -fno-rtti -fno-exceptions
ASFLAGS = -c
CTMP = $(wildcard src/kernel/*.cpp)
ATMP = $(wildcard src/kernel/arch/i386/*.s)
CFILE = $(subst src/kernel/, ,$(CTMP))
AFILE = $(subst src/kernel/arch/i386/, ,$(ATMP))
CSRC = $(CFILE:.c=)
ASRC = $(AFILE:.s=)

OUT = $(wildcard out/*.o)

all: ccompile acompile link

ccompile:
    for file in $(CSRC) ; do \
        $(CC) $(CCFLAGS) src/kernel/$$file -o out/$$file.o ; \
    done

acompile:
    for file in $(ASRC) ; do \
        $(AS) $(ASFLAGS) src/kernel/arch/i386/$$file.s -o out/$$file.o ; \
    done

link:
    ld $(LNFLAGS) -o latest.bin $(OUT)

【问题讨论】:

  • 也许,你想通过生成文件来自动化,例如通过premake 或 CMake。这将花费您更少的时间并生成正确的依赖关系。您的问题的直接答案可能是生成文件的简单扩展,但我会考虑另一种选择
  • 您的问题不清楚。您试图不使用哪些文件路径?
  • @Beta 我正在尝试编译src文件夹下所有目录中的所有cpp文件。
  • 并将所有生成的目标文件放入out/?

标签: c++ makefile


【解决方案1】:

使用vpath 指令指定源目录。

TARGETS := latest.bin

LD      := ld
LDFLAGS := -T linker.ld -melf_i386

CC      := ~/opt/cross/bin/i386-elf-g++
CCFLAGS := -c -ffreestanding -nostdlib -fno-builtin -fno-rtti -fno-exceptions

AS      := ~/opt/cross/bin/i386-elf-as
ASFLAGS := -c

vpath %.cpp  src/kernel
vpath %.s    src/kernel/arch/i386

SOURCES := $(wildcard *.cpp) $(wildcard *.s)
OBJECTS := $(addsuffix .o, $(basename $(notdir $(SOURCES))))

all: $(TARGETS)

out/%.o: %.cpp
    $(CC) $(CCFLAGS) -o $@ $<

out/%.o: %.s
    $(AS) $(ASFLAGS) -o $@ $<

latest.bin: $(OBJECTS)
    $(LD) $(LDFLAGS) -o $@ $^

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多