使用Assembler文件依赖项编译C文件

时间:2011-01-28 11:19:10

标签: makefile assembly

我有一个文件app.c,它调用两个外部函数,即。 func_asm1和func_asm2。这两个函数都在一个单独的汇编程序文件中,即。 func_asm1.S和func_asm2.S。此外, 我有两个头文件,即。 func_asm1.h和func_asm2.h,其中定义了两个汇编程序函数的接口:

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 $@ $< 

func_asm2.o: func_asm2.S
    $(AS) -o $@ $<

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

非常感谢你的帮助!

2 个答案:

答案 0 :(得分:2)

我认为你的makefile有错误的依赖:

最后一部分应该是:

func_asm1.o: func_asm1.S
$(AS) -o $@ $< 

func_asm2.o: func_asm2.S
$(AS) -o $@ $<

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的该部分中的 AND 链接,因此,如果汇编文件的目标代码发生更改,则必须重新链接应用程序,然后执行这些行。

正如我在评论中指出的那样,你应该检查传递给gcc的参数(在SFLAGS中传递的-S标志)

答案 1 :(得分:1)

-S选项告诉gcc生成汇编输出而不是对象,这不是你想要的。

使用gcc时,只需将汇编程序文件传递给gcc:

.S.o:
    $(CC) $(ASFLAGS) -o $@ -c $<

.c.o:
    $(CC) $(CFLAGS) -o $@ -c $<

app: app.o func_asm1.o func_asm2.o
    $(CC) $(LDFLAGS) -o $@ $^

对于依赖关系跟踪,我将使用-MD -MP扩展两个编译规则,并在Makefile中包含生成的* .d 文件,而不是显式列出标题。