2014-06-15 2 views
0

Eclipse에서 CDT를 사용하여 C++로 작성한 atmega328 용 코드를 작성하려고합니다. 두 가지 프로젝트가 있습니다. 하나의 프로젝트는 정적 라이브러리를 생성하는 정적 라이브러리 프로젝트입니다. 라이브러리에있는 모든 파일이 오류없이 컴파일 및 라이브러리는 다음 명령을 사용하여 만들어집니다 : 그런 다음 생성 libRobotMainBoard.aavr-g ++ 정의되지 않은 참조

:

avr-ar -r "libRobotMainBoard.a" ./Console.o ./Motor.o ./RingBuffer.o ./io.o ./operators.o 

C : \ 프로그램 파일 \ WINAVR \ 빈 \의 AVR-ar.exe을 내 atmega에 대한 16 진수 파일을 생성하는 다른 프로젝트에서이 라이브러리를 사용합니다. 이와 유사한 othert

C:\Users\Mitch\Disk Google\workspace\AVR\RobotMainBoard\Release\libRobotMainBoard.a(Console.o): In function Console::putCharToUDR()': Console.cpp:(.text._ZN7Console12putCharToUDREv+0x2): undefined reference to Console::txBuff'

많은 :하지만 연결시 나는 오류가 발생합니다. 웹상에서 해결책을 찾으려고 노력했습니다. 대부분의 사람들은이 오류는 라이브러리와 컴파일 된 파일의 순서가 잘못 지정되어 발생한다고 설명합니다. 나는 그것을 확인하고 나의 명령은 잘되어야한다. 나는 명령으로 연결하고있다 : 나는 밖으로 콘솔 라인을 언급 할 때

#include <util/delay.h> 
#include "Console.h" 
#include "Motor.h" 

Motor leftMotor(9,7); 
Motor rightMotor(10,8); 

int main(){ 
leftMotor.stop(); 
rightMotor.stop(); 

Console::setup(250000); 

    while(1){ 
     Console::send('a'); 
     _delay_ms(2000); 
    } 
} 

하면, 심지어 모터 라인, OK 연결됩니다 :

avr-g++ -Wl,-Map,BoardTest.map,--cref -mrelax -Wl,--gc-sections -L"C:\Users\Mitch\Disk Google\workspace\AVR\RobotMainBoard\Release" -mmcu=atmega328p -o "BoardTest.elf" ./main.o -lRobotMainBoard

MAIN.CPP 파일은 다음과 같습니다 , 어떤 소스 파일은 같은 lib 디렉토리에 있습니다.

콘솔 CPP 파일은 다음과 같다 :

#include <avr/interrupt.h> 
#include "Console.h" 
#include "operators.h" 

void Console::setup(uint16_t baudrate) { 

    rxBuff = new RingBuffer(RX_BUFF_SIZE); 
    txBuff = new RingBuffer(TX_BUFF_SIZE); 

    uint16_t baudPrescaler= (F_CPU/(baudrate * 16)) - 1; 

    UCSR0A = 0x00; UCSR0B = 0x00; UCSR0C = 0x00; 
    //Using 8-bit, asynchronous, normal speed, 1 stop bit, no parity check 

    UBRR0 = baudPrescaler; 
    UCSR0C |= (1 << UCSZ01) | (1 << UCSZ00); //8-bit 

    UCSR0B |= (1 << TXEN0) | (1 << RXEN0); 
    sei(); 
} 

void Console::send(char c) { 
    txBuff->add(c); 
    UCSR0B |= (1 << UDRIE0); 
} 

void Console::send(const char* s) { 
    while(*s){ 
     send(*s++); 
    } 
} 

void Console::putCharToUDR(){ 
    if(!txBuff->empty()){ 
     UDR0 = txBuff->remove(); 
    } else { 
     UCSR0B &= ~(1 << UDRIE0); 
    } 
} 

uint8_t Console::canReceive() { 
    return rxBuff->available(); 
} 

uint8_t Console::canTransmit() { 
    return txBuff->available(); 
} 

ISR(USART_RX_vect, ISR_BLOCK){ 

} 

ISR(USART_UDRE_vect, ISR_BLOCK){ 
    Console::putCharToUDR(); 
} 

당신이 왜 여전히 연결 오류가 어떤 생각 얻고있다의 사람을합니까?

편집 txBuff 정적이기 때문에, 당신이 Console.cpp, 예를 들어, 그것의 정의를 제공해야 1

+0

컴파일러가 txBuff을 찾을 수없는 것 같습니다. Console 클래스에서 정의 했습니까? Console.h를 붙여 넣을 수 있습니까? – JC1

+0

예, Console.h에 정의되어 있습니다. 질문에 Console.h를 추가했습니다. – MitchNajmitch

답변

1

RingBuffer * Console :: txBuff = 새 RingBuffer (RX_BUFF_SIZE);

+0

그게 내 문제를 해결했습니다. 고맙습니다. – MitchNajmitch