0

非再帰メイクファイルに関する Emile van Bergen の記事を読んだ後、再帰から非再帰に移行しようとしていますが、うまくいかないようです。

追記:やっと直りました

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

$ ls -R
.:
folder1  Makefile  test.c  topRules.mk

./folder1:
file.c  Rules.mk

test.c

extern void sub_print();

void main()
{
    printf("Top Hello\r\n");
    sub_print();

}

メイクファイル

TARGET  = test.exe
.PHONY: all
all: $(TARGET)

include topRules.mk
dir = folder1
include folder1/Rules.mk

$(TARGET): test.o $(OBJS_folder1)
        $(LINK) 

topRules.mk

COMPILE = $(CC) $(CFLAGS) -o $@ -c $<
LINK = $(CC)  -o $@ $^ 

%.o:    %.c
    $(COMPILE)  

フォルダー1/Rules.mk

sp := $(sp).x
dirstack_$(sp) := $(d)
d := $(dir)

OBJS_$(d) := $(d)/file.o
$(d): $(OBJS_$(d))

folder1/file.c

void sub_print()
{
    printf("Hello Sub World\r\n");
}
4

2 に答える 2

1
  1. オブジェクトのリストからソースのリストを生成する置換が間違っています。.o拡張機能を削除していません:

     SRC_$(d) := $(OBJS_$(d):%.o=%.c))
                              ^^
    

    変数を完全に削除します。次のポイントでは必要ありません。

  2. この$(OBJS_$(d)): $((SRC_$(d))規則は不必要であり、間違っています。

    1. %.o: %.cパターンルールが適用され、正しいことを行うため、これは不要です。
    2. すべてのコンパイルを行うための 1 つのルールが作成されるため、これは誤りですが、各ソースを個別にコンパイルする必要があります。つまり、2 つのファイルがある場合、次のように展開されます。

      foo.o bar.o : foo.c bar.c
      

      ただし、2 つの個別のルールが必要です。

    そのルールを完全に削除し、他のルールを追加しないでください。正しいルールはそこにあります。

    実際には、エラーは 2 つのルールの相互作用が原因で発生します。ドキュメントには、「ルールが暗黙のルールからコマンドを取得した場合、暗黙のルール$<によって追加される最初の前提条件になります」と記載されています。暗黙の規則%.o: %.cが最初に来るのでコマンドを提供しますが、明示的な規則が前提条件を提供するので、暗黙の規則は何も追加せず、$<何も展開しません。明示的な規則はそこにあるべきではありません。暗黙的なものよりも、前提条件とコマンドの両方が提供され、機能するはずです。

  3. 引数なしの make はファイル内の最初のターゲットを実行するため$(TARGET): ...、インクルードの前にルールを移動するか、最初の近くにルールを定義する必要がありますall: $(TAREGT)(アクションは必要ありませんが、ルールは とマークされている必要があります.phony)。

置換を使用する場所でもルールは必要ないため、実際に置換を行う必要はまったくないことに注意してください。


ディレクトリに特別なフラグが必要な場合があります。そのような場合でも、そのディレクトリ内のファイルに対して特別な暗黙のルールを作成するのではなく、特定のターゲットに対してローカルに変数を設定する特別なルールを作成します。構文は次のようになります。

$(OBJS_$(d)): %.o: %.c
    specific-command

また

$(OBJS_$(d)): %.o: CFLAGS=specific-cflags

後者は依然として一般的な暗黙のルールからレシピを取得しますが、特定の変数のターゲット固有の値を定義します。これは、無効な$(OBJS_$(d)): $(SRC_$(d))ルールで試みられたものだと思います。

これは、GNU make ドキュメントでは静的パターン ルールと呼ばれています。

于 2013-10-02T09:03:47.810 に答える
0

が含まれる前にどのように設定する必要が$(sp)ありますか?$(d)folder1/Rules.mk

設定していないため、空です。

置換$(OBJS_$(d):%=%.c))はおそらくあなたが望むこともしていません。

$(info Current value of d is $(d))変数を何に設定したかを示すために、いくつかの行を追加してみてください。

また、notmain()を返す必要があります。intvoid

于 2013-10-02T08:32:56.690 に答える