2017-06-25 8 views
0

、私は.Cと.cppの両方をチェックする必要があります。makefileに "または"内部依存関係を書き込む方法は?メイクファイルで内部の依存関係を記述する「または」方法

SOURCES=$(wildcard $(SRC)/*.cpp) $(wildcard $(SRC)/*.c) 

myTarget: $(SOURCES:.cpp||.c=.o) 
     g++ ... 

それは、あなたがこのような状況では、「または」を使用することができ、動作していませんか?

+1

は、彼がこのような良いアイデアだとは思いません。同じコンパイラとオプションを使ってCとC++をコンパイルしても必ずしもうまくいくとは限りません。私は2つの別々のルールでこれを扱います。 – user4581301

+3

C++コンパイラでCコードをコンパイルできません。 –

+0

Powerは使えますが、私はCコードのように "or"を使用することについても興味がありました。また、必要なときに.oファイルとしてコンパイルするのではなく、簡単になるライブラリとしてコンパイルします。 – PerduGames

答えて

3

GNU makeを使用しているようです。使用している場合は、関数substの2つの呼び出しを使用できます。

INTERMEDIATE=$(subst .cpp,.o,$(SOURCES)) 
OBJECTS=$(subst .c,.o,$(INTERMEDIATE)) 

myTarget:$(OBJECTS) 

あなたがINTERMEDIATEを使用したくない場合は、あなたが使用することができます。

OBJECTS=$(subst .c,.o,$(subst .cpp,.o,$(SOURCES))) 
+1

ありがとう、それは完全に働いた。 – PerduGames

+0

ディレクトリなしでファイル名だけを取得する方法はありますか? ここにあります: MyTarget:$(SOURCES:.cpp = .o) 私は "scr/file.o"を取得しましたが、 "file.o"を.oファイルを作成する際に " "src"の代わりに "obj"フォルダを作成すると、そのようなことができますか? – PerduGames

+0

@ PerduGamesでは 'notdir'関数を使って' $(SOURCES) 'から' src'を取り除き、 'addprefix'関数を使って各.oファイルに' obj/'を追加することができます。ファイル操作機能の詳細については、[ドキュメントサイト](https://www.gnu.org/software/make/manual/make.html#File-Name-Functions)を参照してください。 –

関連する問題