使用make文件在不同的目录中编译文件

好吧,我从来没有能够掌握制作和制作文件。 我试过没有运气阅读联机帮助页。 所以我来到这里:L

我有一堆文件开始在一个文件中非常不受管理。 (我正在尝试创建一个操作系统)我想尝试将这些文件拆分为单独的子目录(参见下面的结构),然后告诉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 

在此先感谢您的帮助!

杰米。

让我们分阶段:

 all: $(SOURCES) link 

你不必建立源代码,所以让我们把它留下来。 你真正想要构建的是kern/kernel ,所以让我们使用它而不是抽象的“链接:

 all: kern/kernel kern/kernel: ld $(LDFLAGS) -o kernel $(SOURCES) 

但是你想要链接目标文件 ,而不是源文件,并在kern/生成kernel ,而不是在父目录中(我假设你将运行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 

你试图一次做很多事情,所以这可能不会在第一次尝试时起作用。 给它一个旋转,让我们知道结果。