2011-01-28 142 views
1

我有一個文件app.c調用兩個外部函數,即。 func_asm1和func_asm2。這兩個函數都在一個單獨的彙編程序文件中,即。 func_asm1.S和func_asm2.S。此外, 我有兩個頭文件,即。 func_asm1.h和func_asm2.h其中兩個彙編函數的接口定義:編譯C文件與彙編程序文件依賴關係

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

主文件app.c包括兩個頭func_asm1.h和func_asm2.h,我的make文件 着眼於時刻如下,但我不工作...任何人的想法可能是什麼錯誤?

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

你得到了什麼錯誤? – 2011-01-28 11:35:33

回答

2

我覺得你的makefile有錯誤的依賴:

最後一部分應該是這樣的:

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)以及程序集文件的目標代碼。請注意,您正在編譯鏈接該生成文件的部分,因此如果程序集文件的目標代碼發生更改,則必須重新鏈接應用程序並因此執行這些行。

正如我在評論中所指出的,你應該檢查傳遞給GCC的參數(在SFLAGS通過-S標誌)

+0

如果您也在進行鏈接,您應該將「app.o」更改爲「app」(即。object to executable)。另請注意,原始海報在其SFLAGS中有-S,所以gcc只生成彙編列表作爲輸出,而不是對象或可執行文件。 – Jester 2011-01-28 12:49:20

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,包括生成的* .D文件在我Makefile,而不是顯式列出標題。