2

いくつかの .c ファイルと 1 つの .s アセンブリ ファイル (crt0.s) を含む小さなプロジェクトがあります。.c ファイルは .o ファイルにコンパイルされ、./build サブディレクトリに保存されます。これらのファイルは正しくコンパイルおよびリンクされます。

.s ファイルも ./build ディレクトリに保存したいと思います。これまでのところ、私のメイクファイルは .s ファイルをコンパイルして正しい場所に保存していますが、リンカーはそれを見つけることができません。

表示されるエラーは、「ld.exe は crt0.o を見つけることができません」です。crt0.o は確実に ./build ディレクトリに作成されています。

メイクファイルは次のとおりです。

CC=arm-none-eabi-gcc
AS=arm-none-eabi-as

CFLAGS=-nostartfiles -nodefaultlibs -fno-builtin -Wall -T linker.ld -I./Include

objects=$(addprefix $(OBJDIR)/,crt0.o main.o gpiopins.o framebuffer.o drawchar.o putchar.o intconv.o strlen.o kprintf.o kputchar.o)

OBJDIR=./build

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

$(OBJDIR)/%.o: %.c $(DEPS)
    $(CC) -c -o $@ $< $(CFLAGS)

kernel.img: $(objects)
    $(CC) -o kernel.img $(objects) $(CFLAGS)

.PHONY : clean
clean:
    rm -f kernel.img
    rm -f *.o
    rm -f $(OBJDIR)/*.o

私が間違っているかもしれないアイデアはありますか?

ありがとうございました


編集:手動で行う場合は問題ありません。例えば:

kernel.img: $(objects)
    arm-none-eabi-as -o crt0.o crt0.s
    $(CC) -o kernel.img $(objects) $(CFLAGS)

ただし、これは crt0.o が ./build ディレクトリにないことを意味します

4

1 に答える 1

0

「手動」バリアントはどのように問題ありませんか? var オブジェクトには、リンカーが必要とする ./build/crt0.o が含まれています。プッシュした as コマンドはそれを提供していませんが、それはどのように役立ちますか? 仮にそうなったとしても、すべてのオブジェクトが一緒になってルールの依存関係になるため、手遅れになるでしょう。

クリーンにして出力を見せてください。何が起こっているのかを見つけるのに役立つかもしれません。

于 2012-12-31T11:24:53.897 に答える