0

パス置換が正しく機能しません。にたくさんのソースファイルがありますSOURCES:

@echo $(SOURCES)
foo.c bar.cpp bah.cxx

そして、オブジェクト ファイルのリストが必要です。

# Imaginary only because nothing works
@echo $(OBJECTS)
foo.o bar.o bah.o

OBJECTSのリストを作成しようとしていpatsubstます。まず、ソース ファイルとオブジェクト ファイルのリストが作成されます。間違っているだけ_mainでなく、リンクに失敗する重複を引き起こします。

OBJECTS = $(patsubst %.c, %.o, ${SOURCES}) $(patsubst %.cc, %.o, ${SOURCES}) \
          $(patsubst %.cpp, %.o, ${SOURCES}) $(patsubst %.cxx, %.o, ${SOURCES}) 

第二に、これは置換を実行しません。間違っているだけでなく、 で元のリストを取得しSOURCESます。

OBJECTS = $(patsubst %.c %.cc %.cpp %.cxx, %.o, ${SOURCES})

3 番目に、ソース ファイルの元のリストが生成されます。

OBJECTS = $(patsubst %.*, %.o, ${SOURCES})

また、ウサギのようにファイルを増やしているように見える以下を使用してみました:

OBJECTS = $(SOURCES:.c=.o) $(SOURCES:.cc=.o) \
          $(SOURCES:.cpp=.o) $(SOURCES:.cxx=.o)

移植可能な make を使用する場合、拡張機能の単純な置換をどのように実行しますか?

4

3 に答える 3

3

トムの答えは正しい。イータンも活躍します。より短い解決策は次のとおりです。

$(addsuffix .o,$(basename $(SOURCES))
于 2013-10-31T14:31:51.970 に答える
1

まず、patsubst は移植可能ではないと思います。これは GNU の make 機能です。

あなたの質問に対する答えの1つは、次のようなネストされた置換だと思います。

$(patsubst %c,%.o,$(patsubst %.cc,%.o,$(patsubst .....)))
于 2013-10-31T13:26:59.580 に答える
1

フィルターのような関数がある場合は、それを使用できます。それ以外の場合は、段階的に実行できます。

SOURCES := foo.c bar.cpp bah.cxx

O := $(SOURCES)
$(info $(O))
O := $(patsubst %.c,%.o,$(O))
$(info $(O))
O := $(patsubst %.cpp,%.o,$(O))
$(info $(O))
O := $(patsubst %.cxx,%.o,$(O))
$(info $(O))

1 回目 (実質的には同じなので 3 回目) の試行の問題は、patsubst がパターンに一致しない入力内の単語をそのままにしておくことです。したがって、patsubst への複数の呼び出しから OBJECTS を構築したとき、そのパターンに一致しなかったすべての SOURCSE エントリを (各部分で) 複製していました。

2 番目の問題は、patsubst が複数のパターンを取らないため、その誤ったパターンに一致するものがなく、SOURCES が完全に変更されずに返されることです。

于 2013-10-31T13:25:14.960 に答える