我有一堆文件在一个文件中开始变得非常不受管理。 (我正在尝试创建一个操作系统)我想尝试将这些文件拆分为单独的子目录(参见下面的结构),然后告诉make将'make'文件放入他们的.o文件中,将它们移动到另一个文件中单独的子目录,最后以内核文件结束。 (对不起,如果这听起来很复杂,希望结构能让事情变得更清晰)
所以这是我想要的结构树:
Parent directory
( where the makefile will be )
|
|
-------------------------------------------------------------------------
| | | | |
Header SubDir Source SubDir ASM SubDir Obj SubDir Kern SubDir
(Header files ) (Source Files) (Assembly Files) (Object Files) (Kernel File)
这是我目前的makefile:
C_SOURCES= main.c
S_SOURCES= boot.s
C_OBJECTS=$(patsubst %.c, obj/%.o, $(C_SOURCES))
S_OBJECTS=$(patsubst %.s, obj/%.o, $(S_SOURCES))
CFLAGS=-nostdlib -nostdinc -fno-builtin -fno-stack-protector -m32 -Iheaders
LDFLAGS=-Tlink.ld -melf_i386 --oformat=elf32-i386
ASFLAGS=-felf
all: kern/kernel
.PHONY: clean
clean:
-rm -f kern/kernel
kern/kernel: $(S_OBJECTS) $(C_OBJECTS)
ld $(LDFLAGS) -o $@ $^
$(C_OBJECTS): obj/%.o : %.c
gcc $(CFLAGS) $<
vpath %.c source
$(S_OBJECTS): obj/%.o : %.s
nasm $(ASFLAGS) $<
vpath %.s asem
现在正在吐出这个错误:
ld -Tlink.ld -melf_i386 --oformat=elf32-i386 -o kern/kernel obj/boot.o obj/main.o
ld: cannot find obj/boot.o: No such file or directory
ld: cannot find obj/main.o: No such file or directory
提前感谢您的帮助!
杰米。
答案 0 :(得分:0)
让我们分阶段:
all: $(SOURCES) link
您不必构建源代码,所以让我们把它留下来。而你真正想要构建的是kern/kernel
,所以让我们使用它而不是抽象的“链接:
all: kern/kernel
kern/kernel:
ld $(LDFLAGS) -o kernel $(SOURCES)
但是你要链接目标文件而不是源文件,并在kernel
中生成kern/
,而不是在父目录中(我假设你将在那里)正在运行make
):
kern/kernel: $(OBJECTS)
ld $(LDFLAGS) -o $@ $^
有什么对象?好吧,我假设源是.s
文件,并且对象具有相同的名称和不同的后缀,并且位于不同的位置:
SOURCES=boot.s main.s monitor.s common.s descriptor_tables.s isr.s interrupt.s gdt.s timer.s kheap.s paging.s
OBJECTS=$(patsubst %.s,Obj/%.o,$(SOURCES))
这就是你制作一个对象的方式:
$(OBJECTS): Obj/%.o : %.s
nasm $(ASFLAGS) $<
vpath %.s Src
(最后一行是让Make知道在哪里找到来源。)
旗帜看起来不错。这里很干净:
.PHONY: clean
clean:
-rm -f Obj/*.o kern/kernel
你试图一次做很多事情,所以这可能不会在第一次尝试时起作用。给它一个旋转,让我们知道结果。