C++/ AVR. Оператор new[](unsignet int) не определён

98
27 января 2021, 15:40

Пишу на С++ программку для AtMega328p. При компиляции получается ошибка - undefined reference to operator new[](unsigned int) ругается на строчку uint8_t* arr = new uint8_t[10];

Использую gcc, g++ и всё остальное из Atmel Studio Настройки для стандарты язык с11 и с++14 соответственно.

Что делать? Как лечить?

Сообщения среды:

====================[ Build | all | Debug ]=====================================
"D:\Programs\CLion 2019.1.3\bin\cmake\win\bin\cmake.exe" --build D:\Projects\Tests\ModBusRTU\cmake-build-debug --target all -- -j 4
Scanning dependencies of target ControllerTest-atmega328p.elf
[ 10%] Building CXX object CMakeFiles/ControllerTest-atmega328p.elf.dir/src/ModBusRTU/MBBuffer.cpp.obj
[ 20%] Building CXX object CMakeFiles/ControllerTest-atmega328p.elf.dir/src/ModBusRTU/MBMemoryStorage.cpp.obj
[ 30%] Building CXX object CMakeFiles/ControllerTest-atmega328p.elf.dir/src/ModBusRTU/MbFlags.cpp.obj
[ 40%] Building CXX object CMakeFiles/ControllerTest-atmega328p.elf.dir/src/ModBusRTU/ModbusMemoryBlock.cpp.obj
[ 50%] Building CXX object CMakeFiles/ControllerTest-atmega328p.elf.dir/src/ModBusRTU/ModbusRTU.cpp.obj
[ 60%] Building CXX object CMakeFiles/ControllerTest-atmega328p.elf.dir/src/main.cpp.obj
[ 70%] Linking CXX executable ControllerTest-atmega328p.elf
CMakeFiles/ControllerTest-atmega328p.elf.dir/src/ModBusRTU/MBBuffer.cpp.obj: In function `ModBus::MBBuffer::MBBuffer(int)':
D:\Projects\Tests\ModBusRTU\src\ModBusRTU/MBBuffer.cpp:9: undefined reference to `operator new[](unsigned int)'
CMakeFiles/ControllerTest-atmega328p.elf.dir/src/ModBusRTU/ModbusRTU.cpp.obj: In function `ModBus::ModbusRTU::Init(unsigned char, ModBus::BaudRate, unsigned char, ModBus::MbFlags)':
D:\Projects\Tests\ModBusRTU\src\ModBusRTU/ModbusRTU.cpp:18: undefined reference to `operator new(unsigned int)'
CMakeFiles/ControllerTest-atmega328p.elf.dir/src/main.cpp.obj: In function `setup()':
D:\Projects\Tests\ModBusRTU\src/main.cpp:9: undefined reference to `operator new(unsigned int)'
collect2.exe: error: ld returned 1 exit status
mingw32-make.exe[2]: *** [ControllerTest-atmega328p.elf] Error 1
CMakeFiles\ControllerTest-atmega328p.elf.dir\build.make:158: recipe for target 'ControllerTest-atmega328p.elf' failed
mingw32-make.exe[1]: *** [CMakeFiles/ControllerTest-atmega328p.elf.dir/all] Error 2
CMakeFiles\Makefile2:108: recipe for target 'CMakeFiles/ControllerTest-atmega328p.elf.dir/all' failed
mingw32-make.exe: *** [all] Error 2
Makefile:82: recipe for target 'all' failed
Answer 1

В с++ для микроконтроллеров AVR не определены операторы new, new[], delete и delete[] из этого следует, что их нужно определить самому. Здесь приведён пример как это сделать проще всего. Не уверен, что моя реализация delete[] корректна.

Для себя создал отдельный Global.h и Global.cpp со следующим содержимым:

Global.h

#ifndef CONTROLLERTEST_GLOBAL_H
#define CONTROLLERTEST_GLOBAL_H    
#include <stdint.h>
#include <stddef.h>
#include <stdlib.h>    
void* operator new(size_t size);    
void* operator new[](size_t size);    
void operator delete(void* ptr);
void operator delete[](void* ptr);    
__extension__ typedef int __guard __attribute__((mode (__DI__)));    
extern "C" int __cxa_guard_acquire(__guard*);
extern "C" void __cxa_guard_release(__guard*);
extern "C" void __cxa_guard_abort(__guard*);    
extern "C" void __cxa_pure_virtual(void);
#endif //CONTROLLERTEST_GLOBAL_H

Global.cpp

#include "Global.h"   
void* operator new(size_t size) { return malloc(size); }    
void* operator new[](size_t size) { return malloc(size); }    
void operator delete(void* ptr) { free(ptr); }    
void operator delete[](void* ptr) { free(ptr); }    
int __cxa_guard_acquire(__guard* g) { return !*(char*) (g); }    
void __cxa_guard_release(__guard* g) { *(char*) g = 1; }    
void __cxa_guard_abort(__guard*) {}    
void __cxa_pure_virtual(void) {}
READ ALSO
Как устроен рендер ui в Qt?

Как устроен рендер ui в Qt?

Меня интересует как именно устроин рендер с помощью gpu? На основе ui, с помощью ратерезатора, генерируются текстуры, которые затем отправляются...

143
с++ Вызов функции через указатель

с++ Вызов функции через указатель

Прошу сначала ознакомиться с кодом:

132
Как писать приложения для андроид на c++?

Как писать приложения для андроид на c++?

Можно ли вообще написать код на c++ а потом скомпилировать вapk

106
Как изменить GDB в CLion?

Как изменить GDB в CLion?

Написал код под AVR (atmega8p), скомпилировал в elf и hex файлыПри нажатии кнопки debug выдаёт сообщение:

182