簡體   English   中英

avr-g ++的未定義引用

[英]avr-g++ undefined reference to

我正在嘗試使用Eclipse CDT為C ++中的atmega328編寫代碼。 我有兩個項目。 一個項目是靜態庫項目,它產生一個靜態庫。 庫中的所有文件均已正確編譯,並使用以下命令創建了庫:

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

c:\\ Program Files \\ WINAVR \\ bin \\ avr-ar.exe:創建libRobotMainBoard.a

然后,我在其他為我的atmega生成十六進制文件的項目中使用此庫。 但是在鏈接期間我得到了錯誤:

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'

與此類似。 我試圖在網絡上找到解決方案。 他們中的大多數人都提到此錯誤是由命名庫和編譯文件的順序錯誤引起的。 我檢查了一下,訂單還可以。 我將其與命令鏈接:

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文件如下所示:

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

當我注釋掉控制台行時,即使使用Motor行,它也將鏈接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();
}

你們有任何想法嗎,為什么我仍然出現鏈接錯誤?

編輯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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM