如何在ARM Cortex-M芯片上使用STL?

时间:2017-02-15 07:54:16

标签: c++ stl microcontroller cortex-m

我正在使用STM32开发板和MCU G ++编译器&链接器: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?

2 个答案:

答案 0 :(得分:2)

可以通过向G ++链接器添加-specs=nosys.specs来解决此问题。这链接在一个单独的库中,包含所有必需系统函数的实现。

另请参阅:http://pabigot.github.io/bspacm/newlib.html

答案 1 :(得分:1)

C标准库需要一些基本功能(称为存根)才能正常工作。通常,OS提供这些功能。

-specs = nosys.specs提供了这些功能的非常愚蠢的版本。在/ share / doc / gcc-arm-none-eabi / pdf下的编译器路径中,应该有一个pdf libc.pdf,你会在那里找到一些如何自己实现这些存根的信息(章节系统调用)。