编译带有汇编器文件依赖项的 C 文件
我有一个文件 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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
我认为你的 makefile 有错误的依赖关系:
最后一部分应该是这样的:
为什么?因为 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:
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 )
-S
选项告诉 gcc 生成汇编器输出而不是对象,这不是您想要的。当您使用 gcc 时,只需将汇编程序文件传递给 gcc:
为了进行依赖项跟踪,我将使用
-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:
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.