编译带有汇编器文件依赖项的 C 文件

发布于 2024-10-14 21:33:46 字数 638 浏览 1 评论 0原文

我有一个文件 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

非常感谢您的帮助!

I have a file app.c that makes calls to two external functions, ie. func_asm1 and func_asm2. Both functions are in a seperate Assembler file, ie. func_asm1.S and func_asm2.S. Furthermore,
I have two header files, ie. func_asm1.h and func_asm2.h where the interface of the two assembler functions are defined:

extern void func_asm1(unsigned int *r, const unsigned int *a);

The main file app.c includes the two header func_asm1.h and func_asm2.h, my make file
looks at the moment as follows but I does not work... Anyone an idea what could be wrong?

CC  = bin/arm-elf-gcc
AS  = bin/arm-elf-as
SFLAGS=-S -O2

func_asm1.o: func_asm1.S
    $(AS) -o $@ 
lt; 

func_asm2.o: func_asm2.S
    $(AS) -o $@ 
lt;

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

Many thanks for your help!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

悍妇囚夫 2024-10-21 21:33:46

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

最后一部分应该是这样的:

func_asm1.o: func_asm1.S
$(AS) -o $@ 
lt; 

func_asm2.o: func_asm2.S
$(AS) -o $@ 
lt;

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 标志)

I think your makefile has wrong dependencies:

The last part should be something like:

func_asm1.o: func_asm1.S
$(AS) -o $@ 
lt; 

func_asm2.o: func_asm2.S
$(AS) -o $@ 
lt;

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

Why ? Because func_asm1.o and func2.o depends their source code (I am assuming that you don't use func_asm.h in the assembler source code)
On the other hand, app.o depends on its source code (app.c), its header files (app.h, func_asm1.h and func_asm2.h) and the object code for the assembly files. Note that you are compiling AND linking in that part of the makefile so if the object code for the assembly files change, you have to relink the application and therefore execute those lines.

As I've been pointed out in the comments, you should check the parameters passed to gcc (the -S flag passed in SFLAGS )

剧终人散尽 2024-10-21 21:33:46

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

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

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

.c.o:
    $(CC) $(CFLAGS) -o $@ -c 
lt;

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

为了进行依赖项跟踪,我将使用 -MD -MP 扩展两个编译规则并包含生成的 *.d 我的 Makefile 中的文件,而不是显式列出标头。

The -S option tells gcc to generate assembler output rather than an object, which is not what you want.

When you use gcc, just pass the assembler files to gcc:

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

.c.o:
    $(CC) $(CFLAGS) -o $@ -c 
lt;

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

For dependency tracking, I'd extend the two compile rules with -MD -MP and include the generated *.d files in my Makefile, rather than listing headers explicitly.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文