Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Makefile 使用汇编程序文件依赖项编译C文件_Makefile_Assembly - Fatal编程技术网

Makefile 使用汇编程序文件依赖项编译C文件

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

我有一个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
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标志。