我有一个文件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
非常感谢你的帮助!
答案 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 文件,而不是显式列出标题。