Makefile 使用汇编程序文件依赖项编译C文件
我有一个app.c文件,它调用两个外部函数,即func_asm1和func_asm2。这两个函数都位于单独的汇编文件中,即.func_asm1.S和func_asm2.S。此外,, 我有两个头文件,即func_asm1.h和func_asm2.h,其中定义了两个汇编函数的接口:Makefile 使用汇编程序文件依赖项编译C文件,makefile,assembly,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
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
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
非常感谢你的帮助 我认为您的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: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的该部分,因此如果程序集文件的目标代码发生更改,您必须重新链接应用程序,并因此执行这些行
正如我在评论中指出的,您应该检查传递给gcc的参数(在SFLAGS中传递的-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 $@ $^
.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
扩展这两个编译规则,并将生成的*.d文件包含在我的Makefile中,而不是显式列出头文件。如果您也在进行链接,则应将“app.o”更改为“app”(即将对象更改为可执行文件)。另外请注意,原始海报的SFLAGS中有-S,因此gcc只生成作为输出的程序集列表,而不是对象或可执行文件。我已经修复了这个依赖关系,并注意到了-S标志。