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
컴파일러가 txBuff을 찾을 수없는 것 같습니다. Console 클래스에서 정의 했습니까? Console.h를 붙여 넣을 수 있습니까? – JC1
예, Console.h에 정의되어 있습니다. 질문에 Console.h를 추가했습니다. – MitchNajmitch