GCC MakeFile Asrc 的设置-GCC ASM混合编译

      最近一直在学习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起作用!

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值