首页 > 编程知识 正文

GCC MakeFile Asrc 的设置GCC ASM混合编译,设置默认gcc编译器

时间:2023-05-05 22:28:57 阅读:253178 作者:4752

      最近一直在学习V-USB(AVRUSB),弄了一个例程却一直编译不通过,提示 “undefined reference to usbCrc16Append()”。这个其实就是说usbCrc16Append()函数没有定义啦,上网搜了一下这个函数是在usbdrvasm.S的汇编文件里面的定义的汇编函数,提示找不到应该就是编译的时候没有将usbdrvasm.S一起编译,我也不晓得怎么让WinAVR如何将.c和.S文件一起编译(在AVR Studio中只要添加usbdrvasm.S这个文件到SourceFile应该就可以,但是会报其他错误)。

      上网搜了GCC和ASM混为编译,找到的信息都只是说如何在.C中调用.S中的函数,却没有说如何设置让它们一起被编译。我就擅自在mian.c中加了一个#include "usbdrv/usbdrvasm.S" 提示报出一堆错误,只能在去寻找答案。

      后来发现MakeFile里面的Src可以设置多个源程序,就设置Src=main.c usbdrvasm.S,有报了一堆错误,看来这个Src只能为.c的源程序。后来又突然发现MakeFile里面的ASrc的属性可以设置.S的汇编源文件,看来就是它了,设置ASrc=usbdrvasm.S。编译有出错,提示“no rule to make main.elf"。很奇怪哦!按道理应该好了啊,为什么还是不行能?我知道这里编译的过程是将main.c编译成main.o,把usbdrvasm.S编译成usbdrvasm.o,最后在把两个.o文件链接起来。有上网搜了一番,在老外的论坛里有人提示说要加目录 Asrc=usbdrv/usbdrvasm.S,试了一下,果然成功了。在makefile的注释文字里有提示说不要加路径,想不到自己理解错了,只是不需要加根目录的路径,但是子目录的路径还是要加的!

     顺便说一下 ”EXTRAINCDIRS = usbdrv“ 如果你在MakeFile里设置了这个子目录的话,对于#include "usbdrv/usbdrv.h"可以简写成#include "usbdrv.h"。但是对于Asrc=usbdrv/usbdrvasm.S,依然要把目录写全!它只是对#include起作用!

    最后mmdhlg一下,我是新手,我写这些文字只是想让后来者少走一些弯路,毕竟这种细节问题网上很少有讲到。含蓄的魔镜请绕道~

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。