1

最近の問題で、DJGPP は DOS コマンド ラインの文字制限しか受け入れられないことがわかりました。この制限を回避するために、より長い文字列を渡すことができるようにメイクファイルを作成することにしました。メイクファイルをハッキングしてテストする過程で、奇妙なエラーに遭遇しました。メイクファイルは次のとおりです。

AS  :=  nasm
CC  :=  gcc
LD  :=  ld

TARGET      :=  $(shell basename $(CURDIR))
BUILD       :=  build
SOURCES     :=  source

CFLAGS  :=  -Wall -O -fstrength-reduce -fomit-frame-pointer -finline-functions \
            -nostdinc -fno-builtin -I./include
ASFLAGS :=  -f aout

export OUTPUT   :=  $(CURDIR)/$(TARGET)

CFILES      :=  $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.c)))
SFILES      :=  $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.s)))

SOBJS   :=  $(SFILES:.s=.o)
COBJS   :=  $(CFILES:.c=.o)
OBJS    :=  $(SOBJS) $(COBJS)

build   :   $(TARGET).img

$(TARGET).img   :   $(TARGET).bin
    concat.py

$(TARGET).bin   :   $(OBJS)
    $(LD) -T link.ld -o $@ $^

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

$(COBJS)    :   %.o :   %.c
    $(CC) -c $< $(CFLAGS) -o $@

実行しようとすると、次のエラーが表示されます。

make: *** `consoleio.o' が必要とするターゲット `consoleio.c' を作成するルールはありません。止まる。

私が理解できないのは、.c ファイルのルールを見つけようとしている理由です。私が理解していることから、ファイルがそこにある場合は、それを使用するだけです。make で .c ファイルのルールを必要としないようにするにはどうすればよいですか?

4

3 に答える 3

4

あなたがやろうとしていることは、VPATH なしでは機能しません。あなたはまだメイクファイルを学んでいるので、VPATH の使用は避けたいと思います。

ルールは「consoleio.c」を探していますが、makefile が正しく存在しないことを理解していれば、それは存在しません。存在するのは「source/consoleio.c」です。おそらく、「%c」ではなく「$(SOURCES)/%.c」のように変更する必要があります。

ただし、そのルールの構文はチェックしませんでした。正しくない場合は、組み込みの "%.o: %.c" ルールが代わりに使用されますが、これには同じ問題があります。

ただし、あなたのやり方は、私が見た通常の方法ではありません。通常の方法は次のとおりです。

  • 暗黙のルール「%.o: %.c」(または、この場合は「%.o: $(SOURCES)/%.c」) を作成します。
  • 各ファイルの依存関係を明示的にリストします: "foo.o: foo.c bar.h baz.h" (コマンドなし、暗黙のルールにはコマンドがあります)
于 2008-10-19T21:17:31.303 に答える
2

コメント以外の回答を試してみましょう...

可能性A:

  • SFILESのマクロは、' .s'で終わるファイルを探しています。
  • SOBJSをコンパイルするためのルールは、' .asm'で終わるファイルを探しています。

可能性B:

  • SOBJSとCOBJSのルールは、私が認識していない表記法です。
  • GNU Makeのマニュアルによると、暗黙のルールは次のように記述できます。

    %.o:%。c; 指図

''に依存するターゲット$(SOBJS)のリストがあるようです%.o : %.asm。makeがそれをどのように解釈するかはわかりません。

個人的には、ビルドルールでワイルドカードを信頼しません。コードをビルドするために必要なソースファイルを正確にリストすることに時間を費やしたいと思います。結果として、この問題に遭遇することはめったにありません。

于 2008-10-19T18:20:51.377 に答える
2

@CesarBは問題を解決したようです。いくつかの観察を追加します。

  1. ビルド ルールでワイルドカードを使用しないことを強くお勧めします。ビルド ルールは、何をビルドするかを明確に定義する必要があり、ディレクトリにあるファイルに依存しないようにする必要があります。

  2. また、(1) 別のビルド ディレクトリでビルドする場合、または (2) ソース ファイルが多数のディレクトリに分散している場合を除き、VPATH を使用しないことをお勧めします。すべてのソースが単一のディレクトリにある場合、VPATH を使用すると混乱するだけです。

  3. := 代入形式は通常、$(shell ...) を使用する場合など、変数の評価に時間がかかることがわかっている場合にのみ使用されます。それ以外の場合は、"=" を使用することをお勧めします。

  4. "export" を使用して OUTDIR を concat.py に伝達する (concat.py はパラメーターを取らないので、そうであると推測します) のはコードの匂いです。可能であれば、代わりにパラメーターとして渡します。

于 2008-10-20T07:10:29.793 に答える