1

OK、私はメイクとメイクファイルを把握できていません。マンページを読んでみましたが、うまくいきませんでした。だから私はここに来ました:L

1 つのファイルで非常に管理されていないファイルがたくさんあります。(私はOSを作成しようとしています)そして、これらのファイルを別々のサブディレクトリに分割して(以下の構造を参照)、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)

これは私の現在のメイクファイルです:

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

事前に助けてくれてありがとう!

ジェイミー。

4

1 に答える 1

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

あなたは一度にたくさんのことをしようとしているので、これはおそらく最初の試みではうまくいかないでしょう. ぐるぐる回して、結果をお知らせください。

于 2012-04-06T14:41:45.663 に答える