2011-01-28 148 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,而不是显式列出标题。