这部分代码有效。我首先说明我将使用什么编译器以及我的项目的一些基本逻辑(我正在尝试创建一个基本的树莓派操作系统)。我所做的大部分工作都来自我在网上找到的指南https://jsandler18.github.io/tutorial/dev-env.html我不介意重新开始,但想知道发生了什么。
CC = arm-none-eabi-gcc
ifeq ($(RASPI_MODEL),1)
CPU = arm1176jzf-s
DIRECTIVES = -D MODEL_1
else
CPU = cortex-a7
endif
CFLAGS= -mcpu=$(CPU) -fpic -ffreestanding $(DIRECTIVES)
CSRCFLAGS= -O2 -Wall -Wextra
LFLAGS= -ffreestanding -O2 -nostdlib
KER_SRC = ../src/kernel
KER_HEAD = ../include
COMMON_SRC = ../src/common
OBJ_DIR = objects
KERSOURCES = $(wildcard $(KER_SRC)/*.c)
COMMONSOURCES = $(wildcard $(COMMON_SRC)/*.c)
ASMSOURCES = $(wildcard $(KER_SRC)/*.S)
OBJECTS = $(patsubst $(KER_SRC)/%.c, $(OBJ_DIR)/%.o, $(KERSOURCES))
OBJECTS += $(patsubst $(COMMON_SRC)/%.c, $(OBJ_DIR)/%.o, $(COMMONSOURCES))
OBJECTS += $(patsubst $(KER_SRC)/%.S, $(OBJ_DIR)/%.o, $(ASMSOURCES))
HEADERS = $(wildcard $(KER_HEAD)/*.h)
IMG_NAME=kernel.img
GCC 错误指出这部分代码没有输入文件。如果我删除 -o 并移动 -T 它不会给我一个错误,但它仍然不起作用。我猜这与 $(OBJECTS) 或我的标志的顺序有关。
build: $(OBJECTS) $(HEADERS)
echo $(OBJECTS)
$(CC) -T linker.ld -o $(IMG_NAME) $(LFLAGS) $(OBJECTS)
这部分应该创建一个新目录并创建一个易于理解的结构。无论我尝试修改它都不起作用。我怀疑 $(@D) 是罪魁祸首,我在 makefile 中几乎没有发现这方面的文档,也不理解。
$(OBJ_DIR)/%.o: $(KER_SRC)/%.c
mkdir -p $(@D)
$(CC) $(CFLAGS) -I$(KER_SRC) -I$(KER_HEAD) -c $< -o $@ $(CSRCFLAGS)
同样适用于这里,而不是创建一个结构,它什么都不做,绝对什么都不做。
$(OBJ_DIR)/%.o: $(KER_SRC)/%.S
mkdir -p $(@D)
$(CC) $(CFLAGS) -I$(KER_SRC) -c $< -o $@
$(OBJ_DIR)/%.o: $(COMMON_SRC)/%.c
mkdir -p $(@D)
$(CC) $(CFLAGS) -I$(KER_SRC) -I$(KER_HEAD) -c $< -o $@ $(CSRCFLAGS)
无论我尝试什么,这都不会删除任何内容。对于这部分,我不知道可能是什么问题。
clean:
rm -rf $(OBJ_DIR)
rm $(IMG_NAME)
这部分正在工作,我确信如果我运行我的构建,它会执行这个命令并完成它的工作。
run: build
qemu-system-arm -m 1024 -M raspi2 -serial stdio -kernel kernel.img
当我尝试运行这个 makefile 时:
make build
输出如下:
arm-none-eabi-gcc -T linker.ld -o kernel.img -ffreestanding -O2 -
nostdlib
arm-none-eabi-gcc: fatal error: no input files
compilation terminated.
make: *** [Makefile:34: build] Error 1
运行时
ls ../src
终端输出
ls: cannot access '../src': No such file or directory
在终端中运行 'dir' 时会出现以下情况:
boot.o boot.S cpp_make.cpp gcc-arm-none-eabi-10-2020-q4-major kernel.c kernel.img linker.ld Makefile myos.elf rasemu src