avr-g++ 使用 c++ 代码生成错误
avr-g++ generates errors with c++-code
我想用 avr-g++ 编译器和链接器编译我的一些 cpp 函数。我以前项目的经验告诉我,它绝对适用于 new
和 delete
。但是不知何故这个函数编译没有错误:
void usart_controller::send_data(uint32_t * data32, size_t data32_size)
{
size_t data_size = 4 * data32_size;
//uint8_t * data = new uint8_t[data_size];
uint8_t data[data_size];
uint8_t *data_ptr = &data[0];
for(unsigned int i = 0; i < data32_size; i++)
{
for(int j = 0; j < 4; j++)
{
data[i*j+j] = (data32[i] << (j*8));
}
}
/*usart_serial_write_packet(this->usart, *data_ptr, (size_t)(data_size * sizeof(uint8_t)));*/
size_t len = sizeof(uint8_t)*data_size;
while (len) {
usart_serial_putchar(this->usart, *data_ptr);
len--;
data_ptr++;
}
//delete[] data;//Highly discouraged, because of memory leak!//Works as a charme because of C, but I don't care at the moment
}
但与new
相同的功能不起作用:
void usart_controller::send_data(uint32_t * data32, size_t data32_size)
{
size_t data_size = 4 * data32_size;
uint8_t * data = new uint8_t[data_size];
//uint8_t data[data_size];
//uint8_t *data_ptr = &data[0];
for(unsigned int i = 0; i < data32_size; i++)
{
for(int j = 0; j < 4; j++)
{
data[i*j+j] = (data32[i] << (j*8));
}
}
/*usart_serial_write_packet(this->usart, *data_ptr, (size_t)(data_size * sizeof(uint8_t)));*/
size_t len = sizeof(uint8_t)*data_size;
while (len) {
usart_serial_putchar(this->usart, *data);
len--;
data++;
}
delete[] data;
}
这里我得到以下错误:
error: undefined reference to `operator new[](unsigned int)'
error: undefined reference to `operator delete[](void*)'
编译链接命令为(简写):
"C:\Program Files (x86)\Atmel\Atmel Toolchain\AVR8 GCC\Native.4.1061\avr8-gnu-toolchain\bin\avr-g++.exe" -o PreAmp.elf <...> usart_controller.o <...> -Wl,-Map="PreAmp.map" -Wl,--start-group -Wl,-lm -Wl,--end-group -Wl,--gc-sections -mmcu=atxmega16a4u
所以我假设我使用的是 g++ 编译器而不是 gcc 编译器。但是在 cpp 中,不可能像上面那样声明一个可变长度数组。我的错误在哪里?
我没有看到任何关于所用控制器的信息,IDE(如果有的话)。
但是,如果您使用的是 Atmel studio/AVR atmel 的工具链。
他们明确表示不支持新建和删除功能,必须由用户实现。
这是有道理的,因为这不是桌面应用程序,而是 uC 上的实现。
http://www.atmel.com/webdoc/avrlibcreferencemanual/faq_1faq_cplusplus.html
我想用 avr-g++ 编译器和链接器编译我的一些 cpp 函数。我以前项目的经验告诉我,它绝对适用于 new
和 delete
。但是不知何故这个函数编译没有错误:
void usart_controller::send_data(uint32_t * data32, size_t data32_size)
{
size_t data_size = 4 * data32_size;
//uint8_t * data = new uint8_t[data_size];
uint8_t data[data_size];
uint8_t *data_ptr = &data[0];
for(unsigned int i = 0; i < data32_size; i++)
{
for(int j = 0; j < 4; j++)
{
data[i*j+j] = (data32[i] << (j*8));
}
}
/*usart_serial_write_packet(this->usart, *data_ptr, (size_t)(data_size * sizeof(uint8_t)));*/
size_t len = sizeof(uint8_t)*data_size;
while (len) {
usart_serial_putchar(this->usart, *data_ptr);
len--;
data_ptr++;
}
//delete[] data;//Highly discouraged, because of memory leak!//Works as a charme because of C, but I don't care at the moment
}
但与new
相同的功能不起作用:
void usart_controller::send_data(uint32_t * data32, size_t data32_size)
{
size_t data_size = 4 * data32_size;
uint8_t * data = new uint8_t[data_size];
//uint8_t data[data_size];
//uint8_t *data_ptr = &data[0];
for(unsigned int i = 0; i < data32_size; i++)
{
for(int j = 0; j < 4; j++)
{
data[i*j+j] = (data32[i] << (j*8));
}
}
/*usart_serial_write_packet(this->usart, *data_ptr, (size_t)(data_size * sizeof(uint8_t)));*/
size_t len = sizeof(uint8_t)*data_size;
while (len) {
usart_serial_putchar(this->usart, *data);
len--;
data++;
}
delete[] data;
}
这里我得到以下错误:
error: undefined reference to `operator new[](unsigned int)'
error: undefined reference to `operator delete[](void*)'
编译链接命令为(简写):
"C:\Program Files (x86)\Atmel\Atmel Toolchain\AVR8 GCC\Native.4.1061\avr8-gnu-toolchain\bin\avr-g++.exe" -o PreAmp.elf <...> usart_controller.o <...> -Wl,-Map="PreAmp.map" -Wl,--start-group -Wl,-lm -Wl,--end-group -Wl,--gc-sections -mmcu=atxmega16a4u
所以我假设我使用的是 g++ 编译器而不是 gcc 编译器。但是在 cpp 中,不可能像上面那样声明一个可变长度数组。我的错误在哪里?
我没有看到任何关于所用控制器的信息,IDE(如果有的话)。 但是,如果您使用的是 Atmel studio/AVR atmel 的工具链。
他们明确表示不支持新建和删除功能,必须由用户实现。
这是有道理的,因为这不是桌面应用程序,而是 uC 上的实现。
http://www.atmel.com/webdoc/avrlibcreferencemanual/faq_1faq_cplusplus.html