Linker 对“usbInit'”的未定义引用;在C AVR中
我的项目使用v-usb库。 我写了代码,我想编译它,但不幸的是我有一个错误,我无法解决。 这是我的屏幕截图:Linker 对“usbInit'”的未定义引用;在C AVR中,linker,avr,unresolved-external,Linker,Avr,Unresolved External,我的项目使用v-usb库。 我写了代码,我想编译它,但不幸的是我有一个错误,我无法解决。 这是我的屏幕截图: Description Resource Path Location Type make: *** [USB_module.elf] Error 1 USB_module C/C++ Problem undefined reference to `usbInit' main.c /USB_module C/C++ Problem un
Description Resource Path Location Type
make: *** [USB_module.elf] Error 1 USB_module C/C++ Problem
undefined reference to `usbInit' main.c /USB_module C/C++ Problem
undefined reference to `usbMsgPtr' main.c /USB_module C/C++ Problem
undefined reference to `usbPoll' main.c /USB_module C/C++ Problem
这种情况对我来说很奇怪,因为我的标题是:
#include "usbconfig.h"
#include "usbdrv/usbdrv.h"
#include "usbdrv/oddebug.h"
和usbdrv/usbdrv.h
定义了USBpoll
函数:
难道编译器不能编译它吗
以下是我的项目:
这是我的整个工作区目录:
这是我的代码:main.c:
/*
* main.c
*
* Created on: 25-01-2012
* Author: Bordeux
*/
#define F_CPU 12000000
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include <avr/wdt.h>
#include "usbconfig.h"
#include "usbdrv/usbdrv.h"
#include "usbdrv/oddebug.h"
#define DDS1_SDA (1<<1) //PORTB1
#define DDS_SCL (1<<3) //PORTB3
#define DDS_UPDATE (1<<4) //PORTB4
static uchar usb_val;
USB_PUBLIC uchar usbFunctionWrite(uchar *data, uchar len) //sends len bytes to DDS_SDA
{
uchar i;
uchar b;
uchar adr=0;
while (len!=0)
{
b=1;
for (i=0; i<8; i++)
{
if (b & data[adr])
{
PORTB = (PORTB | DDS1_SDA) & ~DDS_SCL;
PORTB = PORTB | DDS_SCL;
}
else
{
PORTB = PORTB & (~DDS1_SDA & ~DDS_SCL);
PORTB = PORTB | DDS_SCL;
}
b=b<<1;
}
len--;
adr++;
}
if (usb_val)
{
PORTB = PORTB | DDS_UPDATE;// update DDS
PORTB = PORTB & ~DDS_UPDATE;
}
return 1;
}
USB_PUBLIC uchar usbFunctionSetup(uchar data[8])
{
usbRequest_t *rq = (void *)data;
static uchar replyBuf[3];
usbMsgPtr = replyBuf;
if(rq->bRequest == 0) // ECHO value
{
replyBuf[0] = data[2]; // rq->bRequest identical data[1]!
replyBuf[1] = data[3];
return 2;
}
if(rq->bRequest == 1) // set port directions
{
// DDRA = data[2];
DDRB = data[3];
DDRD = data[4] & (~USBMASK & ~(1 << 2)); // protect USB interface
return 0;
}
if(rq->bRequest == 2) // read ports
{
// replyBuf[0] = PINA;
replyBuf[1] = PINB;
replyBuf[2] = PIND;
return 3;
}
if(rq->bRequest == 3) // read port states
{
// replyBuf[0] = PORTA;
replyBuf[1] = PORTB;
replyBuf[2] = PORTD;
return 3;
}
if(rq->bRequest == 4) // set ports
{
// PORTA = data[2];
PORTB = data[3];
PORTD = data[4];
return 0;
}
if(rq->bRequest == 5) // use usbFunctionWrite to transfer len bytes to DDS
{
usb_val = data[2]; // usb_val!=0 => DDS update pulse after data transfer
return 0xff;
}
if(rq->bRequest == 6)
{
PORTB = PORTB | DDS_UPDATE; // issue update pulse to DDS
PORTB = PORTB & ~DDS_UPDATE;
return 0;
}
replyBuf[0] = 0xff; // return value 0xff => command not supported
return 1;
}
int main(void)
{
wdt_enable(WDTO_1S); // set Watchdog Timer
odDebugInit();
PORTB=0xe0; // Set PortB 0-4 zero
DDRB=0x1f; // Set PORTB 0-4 output
PORTD = 0; /* no pullups on USB pins */
DDRD = ~USBMASK & ~(1 << 2); /* all outputs except USB data and PD2 = INT0 */
usbInit();
sei();
for(;;) /* main event loop */
{
wdt_reset(); // restart watchdog timer
usbPoll();
}
return 0;
}
/*
*main.c
*
*创建日期:25-01-2012
*作者:Bordeux
*/
#定义F_CPU 12000000
#包括
#包括
#包括
#包括
#包括“usbconfig.h”
#包括“usbdrv/usbdrv.h”
#包括“usbdrv/oddebug.h”
#定义DDS1_SDA(不支持1个命令
返回1;
}
内部主(空)
{
wdt_启用(WDTO_1S);//设置看门狗定时器
odDebugInit();
PORTB=0xe0;//将PORTB 0-4设置为零
DDRB=0x1f;//设置端口B 0-4输出
端口D=0;/*USB引脚上无上拉*/
DDRD=~USBMASK&~(1您需要链接任何提供的文件usbInit
等,从屏幕截图的外观来看,您已经显示了文件usbdrv.c,但没有实际编译/链接到项目中。树视图中只显示了usbdrv.h
#include
如果头文件向编译器显示函数的声明,您需要确保它也在某个地方看到定义。您需要链接任何提供的文件usbInit
等,从屏幕截图的外观来看,您已经显示了文件usbdrv.c,但实际上没有编译/链接到您的文件中树视图中仅显示usbdrv.h
#include
如果头文件向编译器显示函数声明,则需要确保它也在某处看到定义。解决方案:
mv usbdrv.c usbdrv.cpp
或者使用avr-g++
解决方案编译:
mv usbdrv.c usbdrv.cpp
或者使用avr-g++
编译,也可以在外部“C”中包含usbdrv.h:
您还可以将usbdrv.h包含在外部“C”中:
令人惊讶地更改名称真的有效!如此简单的解决方案!令人惊讶地更改名称真的有效!如此简单的解决方案!