2012-01-26 4 views
2

내 프로젝트에 v-usb 라이브러리를 사용합니다. 코드를 작성했지만 컴파일하고 싶지만, 불행하게도 해결할 수없는 오류가 있습니다. C에서 'usbInit'에 대한 정의되지 않은 참조 AVR

:

#include "usbconfig.h" 
#include "usbdrv/usbdrv.h" 
#include "usbdrv/oddebug.h" 

그리고 usbdrv/usbdrv.hUSBpoll 함수를 정의 : 내가 헤더이에 있기 때문에

enter image description here

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 

이 상황이 나를 위해 이상하다 : 여기 내 스크린 샷

컴파일러가 컴파일 할 수 없습니까? 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; 
} 

답변

2

당신은 어떤 파일에 링크 할 필요가 여기에

http://minus.com/mbhTkJuvOK#1 내 코드입니다 : 여기

내 프로젝트입니다 : http://goo.gl/P6ujK

그리고 여기 내 전체 작업 공간 디렉토리입니다 usbInit 등을 공급합니다. 스크린 샷을 보면 usbdrv.c 파일을 보았지만 실제로 프로젝트에 컴파일/링크되지 않았습니다. usbdrv.h만이 트리 뷰에 표시됩니다. 헤더 파일을 보내고

#include 컴파일러에게 함수의 선언을 보여줍니다, 당신은 어딘가에 너무 정의을 볼 수 있는지 확인해야합니다.

2

솔루션 :

mv usbdrv.c usbdrv.cpp 

또는

+0

avr-g++ 놀랍게도 정말 작동 이름을 변경 컴파일! 그런 간단한 해결책! – Chris