2016-07-27 9 views
0

Makefileには、.o.dのファイルをコンパイルして生成する行がいくつかあります。私は.o.dの二組を生成することにしたい、のようなもの:おそらく私は[email protected]で再生する必要がありますが、どのよう見当がつかないMakefileとgccを使って.oファイルの名前を変更

name.d 
name_hello.d 
name.o 
name_hello.o 

はすでに"$(@:.o=_hello.d)"を使用して.dの名前を変更する方法を見つけたが何の成功は、.oの変更なかったですそれをするために。ここで

は、ファイルのコードを作成している:

$(OBJECT_DIRECTORY)/%.o: %.c 
# Build header dependencies 
    $(CC) $(CFLAGS) $(INCLUDEPATHS) -M $< -MF "$(@:.o=.d)" -MT [email protected] 
    $(CC) $(CFLAGS) $(INCLUDEPATHS) -M $< -MF "$(@:.o=_hello.d)" -MT [email protected] 
# Do the actual compilation 
    $(CC) $(CFLAGS) $(INCLUDEPATHS) -c -o [email protected] $< 
    $(CC) $(CFLAGS) $(INCLUDEPATHS) -c -o [email protected] $< - this line i want to change 

私は腕とmake.exe


更新

ためarm-none-eabi-gcc.exeを使用する別のターゲットを使用して名前を変更するよりも兼ね備えソリューションであると思われます。だから、私はそれのための別の目標をした。しかし、決して使用されません。

C_OBJECTS = $(addprefix $(OBJECT_DIRECTORY)/, $(C_SOURCE_FILENAMES:.c=.o)) 

を、私は私のような何かにそれを変更する必要があるとします:

C_OBJECTS_hello = $(addprefix $(OBJECT_DIRECTORY)/, $(C_SOURCE_FILENAMES:.c=*_hello.o)) 

方法教えてくださいメイクファイルの他の場所では、コンパイラ何.oファイルを使用するように指示するコードの次の行がありますコンパイラの使用に*_hello.oファイル


を作るためにC_OBJECTSを修正するためのアップデート2

これはC_OBJECTSの使用方法を、私はC_OBJECTSにおけるフィルタのいくつかの種類がCCarm-none-eabi-gcc.exe)は、特定の.oファイルを使用するように指示したとしています。 *_hello.oのファイルはフィルタで使用されていないため、ターゲットでも生成されません。

## Link C and assembler objects to an .out file 
$(OUTPUT_BINARY_DIRECTORY)/$(OUTPUT_FILENAME).out: $(BUILD_DIRECTORIES) $(C_OBJECTS) $(ASSEMBLER_OBJECTS) $(LIBRARIES) 
    $(CC) $(LDFLAGS) $(C_OBJECTS) $(ASSEMBLER_OBJECTS) $(LIBRARIES) -o $(OUTPUT_BINARY_DIRECTORY)/$(OUTPUT_FILENAME).out 

まだ答えを見つけることができない私は、これはメイクヘルプに書かれていることを知っていると私はそれを読んでいますが、


アップデート3ここで

i「はC_OBJECTSを修正する方法れます'と表示され、次のように表示されます。

C_OBJECTS_hello = $(addprefix $(OBJECT_DIRECTORY)/, $(C_SOURCE_FILENAMES:.c=_hello.o)) 
+0

しかし、 '.o'_を変更しても何の変化もありません。 –

+0

私の目的は* .oと* _hello.oファイルの両方を持つことです。 –

+1

http://stackoverflow.com/a/7358961/412080 –

答えて

1

本当に置き換えを使用します。 [email protected]変数は、一致するすべての%.oを展開します。だからあなたは$(@:.o=.d)の代用品を持っていた。それぞれ%.o件の一致ファイル.dが必要でした。

この場合、実際には$(@:.o=_hello.o)の代替品を使用できます。これは%.c入力の依存関係ではないことに注意してください。これは副出力です。

代わりに、2番目の出力$(OBJECT_DIRECTORY)/%.o $(OBJECT_DIRECTORY)/%_hello.o: %.cを追加します。この場合、[email protected]は使用せず、一致するである$*を使用します。したがって、あなたの2つの依存関係ファイルは$(OBJECT_DIRECTORY)/$*.dとなり、$(OBJECT_DIRECTORY)/$*_hello.d

+0

makeはそれを全く意識していないので、_secondary_出力でさえありません。 –

+0

@MaximEgorushkin:そうです、それを出力として列挙しておくべきです。 – MSalters

+0

見てください、私はトピックを更新しました。 * _hello.oのターゲットを別にしましたが、ターゲットは使用されませんでした。 –

1

あなたのメイクファイルルールは、makeが認識しているファイルより多くのファイルを生成します。 $(OBJECT_DIRECTORY)/%.o: %.c.o.cから構築しますが、4つのファイルを作成したいとします。これらのルールは、明示的にコンパイラが決定させる、.d出力ファイルに名前を付けていないことを

$(OBJECT_DIRECTORY)/%.o $(OBJECT_DIRECTORY)/%.d: %.C# Compile and build dependencies. 
    $(CC) -c -o [email protected] $(CFLAGS) $(INCLUDEPATHS) -MD -MP $< 

$(OBJECT_DIRECTORY)/%_hello.o $(OBJECT_DIRECTORY)/%_hello.d: %.C# Compile and build dependencies. 
    $(CC) -c -o [email protected] $(CFLAGS) $(INCLUDEPATHS) -MD -MP $< 

注:あなたが、それは完全な依存関係グラフを構築することができるように、生成しそのルールをどのファイルmakeに認識させる必要がある

.o.dに置き換えてください。

makeは、-jフラグが使用されたときに実行を並列化できます。

https://stackoverflow.com/a/7358961/412080に記載されている理由により、自動生成された依存関係の明示的なルールは必要ありません。

+0

ありがとう、これは便利です、私は必要な2つのファイルのセットを生成するような2つのターゲットを行った。 –

関連する問題