2011-01-28 9 views
1

私は、ファイルapp.cを持っています。 func_asm1およびfunc_asm2。両方の関数は、別々のアセンブラファイルにあります。 func_asm1.Sおよびfunc_asm2.S。さらに、 私は2つのヘッダファイルを持っています。 func_asm1.hとfunc_asm2.h 2つのアセンブラ関数のインタフェースが定義されている場所:アセンブラファイルの依存関係を持つCフ​​ァイルのコンパイル

extern void func_asm1(unsigned int *r, const unsigned int *a); 

メインファイルapp.cは、2つのヘッダfunc_asm1.hとfunc_asm2.hを含み、私のメイクファイル を見て次のような瞬間が、私は動作しません...誰かが間違っている可能性があるアイデア?

CC = bin/arm-elf-gcc 
AS = bin/arm-elf-as 
SFLAGS=-S -O2 

func_asm1.o: func_asm1.S 
    $(AS) -o [email protected] $< 

func_asm2.o: func_asm2.S 
    $(AS) -o [email protected] $< 

app.o: app.c app.h func_asm1.h func_asm2.h 
    $(CC) $(SFLAGS) app.c -o app.o func_asm1.o func_asm2.o 

ご協力いただきありがとうございます。

+0

どのようなエラーが表示されますか? –

答えて

2

私はあなたのメイクファイルが間違った依存関係を持っていると思う:

最後の部分のようなものでなければなりません:

func_asm1.o: func_asm1.S 
$(AS) -o [email protected] $< 

func_asm2.o: func_asm2.S 
$(AS) -o [email protected] $< 

app: app.c app.h func_asm1.h func_asm2.h func_asm1.o func_asm2.o 
$(CC) $(SFLAGS) app.c -o app.o func_asm1.o func_asm2.o 

なぜ? func_asm1.oとfunc2.oはソースコードに依存するので(アセンブラソースコードでfunc_asm.hを使用しないと仮定しています) 一方、app.oはソースコード(app.c)に依存しています。 、ヘッダーファイル(app.h、func_asm1.h、func_asm2.h)とアセンブリファイルのオブジェクトコードが含まれています。 をmakefileのその部分にリンクしているので、アセンブリファイルのオブジェクトコードが変更された場合は、アプリケーションを再リンクして、それらの行を実行する必要があります。

私はコメントで指摘されてきたように、あなたはGCCに渡されたパラメータをチェックする必要があります(SFLAGSに渡さ-Sフラグ)

+0

リンクを行っている場合は、「app.o」を「app」(実行可能オブジェクト)に変更する必要があります。また、元のポスターのSFLAGSには-Sが含まれているので、gccはオブジェクトや実行可能ファイルではなく、出力としてアセンブリリストを生成しています。 – Jester

+0

あなたは正しいです。私はその依存関係を修正し、-Sフラグについて注意しました。 – gusbro

1

-Sオプションは、アセンブラ出力ではなく、オブジェクトを生成するために、GCCを伝え、それはあなたが望むものではありません。

gccを使用して、ちょうどGCCにアセンブラファイルを渡す:依存性の追跡のために

.S.o: 
    $(CC) $(ASFLAGS) -o [email protected] -c $< 

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

app: app.o func_asm1.o func_asm2.o 
    $(CC) $(LDFLAGS) -o [email protected] $^ 

を、私は-MD -MP 2つのコンパイル規則を拡張し、生成された* .dの私の中ファイルをインクルードしたいです明示的にヘッダーをリストするのではなく、Makefile。

関連する問題