2017-02-15 3 views
1

Ich benutze STM32 dev board mit MCU G ++ Compiler & Linker: arm-none-eabi-g++. Allerdings scheint es nicht kompatibel mit STL:Wie benutzt man STL auf ARM Cortex-M Chips?

#include <list> 

int main (void) 
{ 
    std::list<int> list; 

    list.push_back(1); 
    list.sort(); 

    return 0; 
} 

Die Linkerfehlermeldungen:

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' 

Die C++ STL scheint abhängig von Betriebssystemen. Da der Mikrocontroller keine solchen Dinge hat, fehlen diese wesentlichen Teile während der Verknüpfung von ELF.

Das Problem ist, wie kann ich STL auf STM32 L4-Serie Chips verwenden?

+2

Diese Linker-Nachrichten haben nichts mit der C++ - Standardbibliothek zu tun. Sieht so aus, als ob dir Bindings für newlib oder ähnliches fehlen. –

+0

Sie müssen möglicherweise einen neueren [GCC] (http://gcc.gnu.org/) Cross-Compiler installieren, und vielleicht andere Dinge (ein Cross-Binutils, eine Cross-libc). Es ist eine Frage der Systemadministration und der Installation relevanter und neuer Build-Tools. –

+0

@ πάνταῥεῖ @BasileStarynkevitch Ich habe dem Linker '-specs = nosys.specs' hinzugefügt, und dann sind keine Fehler aufgetaucht !! Problem gelöst. –

Antwort

0

Die C Standardlibrary braucht einige grundlegende Funktionen (so genannte Stubs) richtig zu arbeiten. Normalerweise bietet das Betriebssystem diese Funktionen.

-specs = nosys.specs bietet sehr dumme Versionen dieser Funktionen. In Ihrem Compiler-Pfad unter/share/doc/gcc-arm-none-eabi/pdf sollte es eine pdf libc.pdf geben, dort finden Sie einige Informationen, wie Sie diese Stubs selbst implementieren können (Kapitel Systemcalls).

2

Dieses Problem kann durch Hinzufügen von -specs=nosys.specs zum G ++ - Linker gelöst werden. Dies verlinkt in einer separaten Bibliothek mit Implementierungen für alle erforderlichen Systemfunktionen.

Siehe auch: http://pabigot.github.io/bspacm/newlib.html