Linker 对“usbInit'”的未定义引用;在C AVR中

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

我的项目使用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
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”中:


令人惊讶地更改名称真的有效!如此简单的解决方案!令人惊讶地更改名称真的有效!如此简单的解决方案!