的未定义引用

avr-g++ undefined reference to

本文关键字:引用 未定义      更新时间:2023-10-16

我正在尝试使用Eclipse CDT在c++中为我的atmega328编写代码。我有两个项目。一个项目是静态库项目,它产生一个静态库。编译库中的所有文件都没有错误,并且使用以下命令创建库:

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

c:Program FilesWINAVRbinavr-ar.exe: creating librobot主板.a

然后我在其他项目中使用这个库,为我的atmega生成十六进制文件。但是在链接过程中,我得到错误:

C:UsersMitchDisk GoogleworkspaceAVRRobotMainBoardReleaselibRobotMainBoard.a(Console.o): In function Console::putCharToUDR()': Console.cpp:(.text._ZN7Console12putCharToUDREv+0x2): undefined reference to Console::txBuff'

和许多其他类似的。我试着在网上找到解决方案。其中大多数提到这个错误是由于命名库和编译文件的顺序错误造成的。我检查过了,我点的应该没问题。我用命令链接它:

avr-g++ -Wl,-Map,BoardTest.map,--cref -mrelax -Wl,--gc-sections -L"C:UsersMitchDisk GoogleworkspaceAVRRobotMainBoardRelease" -mmcu=atmega328p -o "BoardTest.elf" ./main.o -lRobotMainBoard

main.cpp文件如下所示:

#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);
    }
}

当我注释出Console行时,它将链接OK,甚至与马达行,这些源文件在同一个库中。

控制台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();
}

你们中有谁知道,为什么我仍然得到链接错误?

EDIT 1

#ifndef CONSOLE_H_
#define CONSOLE_H_
#include "RingBuffer.h"
#define RX_BUFF_SIZE 32
#define TX_BUFF_SIZE 32
class Console {
public:
    static void setup(uint16_t baudrate);
    static void send(char c);
    static void send(const char* s);
    static uint8_t canReceive();
    static uint8_t canTransmit();
    static void putCharToUDR();
private:
    static RingBuffer *rxBuff;
    static RingBuffer *txBuff;
};
#endif /* CONSOLE_H_ */

由于txBuff是静态的,您必须在Console.cpp中提供它的定义,例如:RingBuffer * Console::txBuff = new RingBuffer(RX_BUFF_SIZE);