gpt4 book ai didi

c++ - avr-g++ undefined reference

转载 作者:行者123 更新时间:2023-11-28 06:49:35 25 4
gpt4 key购买 nike

我正在尝试使用 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):在函数 Console::putCharToUDR()' 中:
Console.cpp:(.text._ZN7Console12putCharToUDREv+0x2):未定义对 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);
}
}

当我注释掉 Console 行时,它会链接 OK,即使是 Motor 行,其源文件在同一个库中。

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

关于c++ - avr-g++ undefined reference ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24231813/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com