9

私はすでにstackoverflowや他のmakeマニュアル、ウェブサイトを長い間検索してきましたが、make関数の末尾の空白やミスの使用法を見つけることができません. この警告メッセージを解決するのを手伝ってくれませんか?

make: Circular main.asm.o <- main.asm dependency dropped.

メイクファイル:

AS:=yasm
CC:=gcc
OUTPUTDIR:=$(shell pwd)/bin
ASFLAGS:=-g dwarf2 -f elf64 -a x86
CFLAGS:=-g

SOURCES=$(wildcard *.asm)
OBJECTS=$(patsubst %.asm,%.o,$(SOURCES))

%.o: $(SOURCES)
    $(AS) $(ASFLAGS) -o $(OUTPUTDIR)/$(OBJECTS) $<

all: $(OBJECTS)
    $(CC) $(CFLAGS) -o httpd $(OUTPUTDIR)/$(OBJECTS)

clean:
    rm $(OUTPUTDIR)/*
    rm httpd

main.asm:

section .text
  global main
  extern exit

main:
  mov rdi, 1
    call exit   

ありがとうございます :)

4

2 に答える 2

13

エラーは次の行です。

%.o: $(SOURCES)

これはおそらく次のように展開されます

%.o: main.asm foo.asm bar.asm

それが意味することは、非常に近似的なものです

main.asm.o: main.asm
foo.asm.o: foo.asm
bar.asm.o: bar.asm
    ....

ここで構文を混同しているため、それは「およそ」です。

通常のルール ( target: source) とワイルドカード ルール ( ) を混同しています%.target: %.source。おそらくあなたが望むのは

%.o: %.asm
    $(AS) $(ASFLAGS) -o $@ $<

.oファイルから.asmファイルを作成する方法と、

httpd: $(SOURCES:.asm=.o)
    $(CC) $(CFLAGS) -o httpd $*

.oこれは、さまざまなファイルをhttpd実行可能ファイルに結合する方法を Make に指示します。$(SOURCES:.asm=.o)変数参照は依存関係としてファイルのリストに展開され、Make.o.o対応するファイルからそれらのファイルを作成する方法を認識し.asmます。

追加の観察:

  1. 明らかでない場合$(SOURCES:.asm=.o)は、 の値に展開しますが$(SOURCES)、末尾を.asmに置き換え.oます。
  2. が個人的wildcardにこの Makefile で行うことは、 の定義内のSOURCESをファイルの明示的なリストに置き換えることです。そうすれば、たとえばmy-temp-test.asmディレクトリにファイルを追加する場合に、予期しない結果が得られることはありません。(これは、「どうすれば未来の私に親切になれるか」という見出しの下にあります。)
于 2014-07-23T19:32:43.067 に答える
2
AS:=yasm
CC:=gcc
ASFLAGS:=-g dwarf2 -f elf64 -a x86
CFLAGS:=-g

OBJECTSDIR:=$(shell pwd)/bin
SRCDIR:=$(shell pwd)/src
SOURCES=$(wildcard $(SRCDIR)/*.asm)
OBJECTS=$(shell find $(OBJECTSDIR) -name *.o)


%.o: %.asm
    $(AS) $(ASFLAGS) -o $(subst $(SRCDIR),$(OBJECTSDIR),$@) $<

httpd: $(SOURCES:.asm=.o)
    $(CC) $(CFLAGS) -o httpd $(OBJECTS)


clean:
    rm -f $(OBJECTSDIR)/*
    rm -f httpd

説明ノーマンのおかげで、私はそれをしました。すべてを明確に保つために、/bin と /src という個別のフォルダーを用意することが重要です。

ありがとう、それは働いていて、私は自分のエラーを理解しています。

注: オブジェクト ファイルを Makefile フォルダーに入れると、make から奇妙なエラーが発生しました...それらを削除するだけで、再び機能します。

于 2014-07-23T08:58:25.057 に答える