2011-09-15 13 views
1

私は私が一緒にリンクする必要がアセンブリとCのソースコードが混在しているMakefileのターゲットは、

:-(私のMakefileでトラブルを抱えている。私は両方以来。これら二つのタイプごとに異なるビルド手順が必要私は今しようとしている何%Cの建設が多い例で見つかったのMakefile

この:アセンブラとCコンパイラの出力* .oファイル、私は一般的な%の.oのを使用することはできません。

は、すべてのリストを取得します。 Cファイルと結果の出力ファイル:

C_SRCFILES := $(shell find $(SRCDIRS) -type -f -name "*.c") 
C_OBJFILES := $(patsub %.c,%.o,$(C_SRCFILES)) 

すべてのASMファイルとその結果の出力ファイルのリストを取得します:

A_SRCFILES := $(shell find $(SRCDIRS) -type -f -name "*.asm") 
A_OBJFILES := $(patsub %.asm,%.o,$(A_SRCFILES)) 

私は画面にそれらのVARSをエコーするとき、彼らは正しいように見えるが、どのように私は今、自分の目標を定義していますか?

は私が...

任意の提案を、この

$(A_OBJFILES): ($A_SRCFILES) 
    $(AS) $(AFLAGS) -o [email protected] $* 

$(C_OBJFILES): ($C_SRCFILES) 
    $(CC) $(CFLAGS) -c -o [email protected] $* 

all: $(A_OBJFILES) $(C_OBJFILES) 
    $(LD) $(LDFLAGS) $(A_OBJFILES) $(C_OBJFILES) -o $(TARGET_OUTPUT) 

が、勿論、これは動作しないようなものを試してみましたか?

答えて

4

第1の問題:間違ったかっこまたは2つ。

$(A_OBJFILES): ($A_SRCFILES) 

あなたは($A_SRCFILES)($を持って注意してください。 Makeは$Aを展開しますが、これは何も起こりません。私はあなたが$(A_SRCFILES)を意味し、他のルールで同じことを意味したと思います。

第二の問題:私はアセンブラの構文を知らないが、コンパイラのコマンドの構文が間違っている:

$(CC) $(CFLAGS) -c -o [email protected] $* 

我々はパターンルールではいないのであれば、変数$*は何もありません、私たちはまだ(まだ)そうではありません。とにかく、パターンルールにあって、foo.oをビルドしようとすると、このコマンドはソースファイルfooを探しますが、そのようなファイルはありません。このようにそれを実行します。

$(CC) $(CFLAGS) -c -o [email protected] $< 

第三の問題:オブジェクトファイルがすべてのソースファイル(各ルールで)に依存します。

$(A_OBJFILES): %.o : %.asm 
    ... 

$(C_OBJFILES): %.o : %.c 
    ... 

それはパターンルールです。)

第4の問題点:代わりにこれを試してみてください最後のルールでは多くの冗長性。このように変更します。

all: $(A_OBJFILES) $(C_OBJFILES) 
    $(LD) $(LDFLAGS) $^ -o $(TARGET_OUTPUT) 

またはより良いまだ:%:

all: $(TARGET_OUTPUT) 

$(TARGET_OUTPUT): $(A_OBJFILES) $(C_OBJFILES) 
    $(LD) $(LDFLAGS) $^ -o [email protected] 
+0

[OK]を、私は今、正常に動作してそれを持っています。ありがとうございます:-) –

+0

なぜあなたは答えを受け入れるのですか? –

2

を両方アセンブラとCコンパイラの出力* .oのファイルので、私は一般的な%の.oのを使用することはできません。Cの構造は、多くの場合、あなたができる

確かに例のMakefileで見つかった:

%.o : %.c 
    # commands to make .o from a corresponding .c 

%.o : %.asm 
    # commands to make .o from a corresponding .asm 
+0

コロン: '::'を二重にします。 http://www.gnu.org/software/make/manual/html_node/Double_002dColon.html – reinierpost

+1

ここにダブルコロンは必要ありません。 –

関連する問題