您的位置:首页 > 其它

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

2009-11-22 10:37 288 查看
最近一直在学习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起作用!

最后申明一下,我是新手,我写这些文字只是想让后来者少走一些弯路,毕竟这种细节问题网上很少有讲到。高手请绕道~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: