如何在ARM Cortex-M芯片上使用STL?
How to use STL on ARM Cortex-M chips?
我正在使用带有 MCU G++ 编译器和链接器的 STM32 开发板:arm-none-eabi-g++
。但是,它似乎与STL不兼容:
#include <list>
int main (void)
{
std::list<int> list;
list.push_back(1);
list.sort();
return 0;
}
链接器错误消息:
abort.c:(.text.abort+0xa): undefined reference to `_exit'
fstatr.c:(.text._fstat_r+0x10): undefined reference to `_fstat'
signalr.c:(.text._kill_r+0x10): undefined reference to `_kill'
signalr.c:(.text._getpid_r+0x0): undefined reference to `_getpid'
writer.c:(.text._write_r+0x12): undefined reference to `_write'
closer.c:(.text._close_r+0xc): undefined reference to `_close'
isattyr.c:(.text._isatty_r+0xc): undefined reference to `_isatty'
lseekr.c:(.text._lseek_r+0x12): undefined reference to `_lseek'
readr.c:(.text._read_r+0x12): undefined reference to `_read'
C++ STL 似乎依赖于操作系统。由于微控制器没有这些东西,因此在链接ELF时缺少这些重要部分。
问题是如何在 STM32 L4 系列芯片上使用 STL?
这个问题可以通过在 G++ 链接器中添加 -specs=nosys.specs
来解决。这链接在一个单独的库中,其中包含所有必需的系统功能的实现。
C 标准库需要一些基本函数(称为存根)才能正常工作。通常 OS 提供这些功能。
-specs= nosys.specs 提供了这些函数的非常愚蠢的版本。在 /share/doc/gcc-arm-none-eabi/pdf 下的编译器路径中应该有一个 pdf libc.pdf 在那里你会找到一些关于如何自己实现这些存根的信息(系统调用一章)。
我正在使用带有 MCU G++ 编译器和链接器的 STM32 开发板:arm-none-eabi-g++
。但是,它似乎与STL不兼容:
#include <list>
int main (void)
{
std::list<int> list;
list.push_back(1);
list.sort();
return 0;
}
链接器错误消息:
abort.c:(.text.abort+0xa): undefined reference to `_exit'
fstatr.c:(.text._fstat_r+0x10): undefined reference to `_fstat'
signalr.c:(.text._kill_r+0x10): undefined reference to `_kill'
signalr.c:(.text._getpid_r+0x0): undefined reference to `_getpid'
writer.c:(.text._write_r+0x12): undefined reference to `_write'
closer.c:(.text._close_r+0xc): undefined reference to `_close'
isattyr.c:(.text._isatty_r+0xc): undefined reference to `_isatty'
lseekr.c:(.text._lseek_r+0x12): undefined reference to `_lseek'
readr.c:(.text._read_r+0x12): undefined reference to `_read'
C++ STL 似乎依赖于操作系统。由于微控制器没有这些东西,因此在链接ELF时缺少这些重要部分。
问题是如何在 STM32 L4 系列芯片上使用 STL?
这个问题可以通过在 G++ 链接器中添加 -specs=nosys.specs
来解决。这链接在一个单独的库中,其中包含所有必需的系统功能的实现。
C 标准库需要一些基本函数(称为存根)才能正常工作。通常 OS 提供这些功能。
-specs= nosys.specs 提供了这些函数的非常愚蠢的版本。在 /share/doc/gcc-arm-none-eabi/pdf 下的编译器路径中应该有一个 pdf libc.pdf 在那里你会找到一些关于如何自己实现这些存根的信息(系统调用一章)。