I try to compile some C++ code with <iostream> included. Build output:
.\DEBUG.axf: Error: L6218E: Undefined symbol __fread_bytes_avail (referred from ios.o). .\DEBUG.axf: Error: L6218E: Undefined symbol mbsinit (referred from ios.o). .\DEBUG.axf: Error: L6218E: Undefined symbol wmemmove (referred from ios.o).
Somebody said: It's because microLib does not implement full set of features as ARM library (C standard library). On infocenter.arm.com/.../index.jsp written: The default version of __fread_bytes_avail() fills a buffer by calling fgetc() until either the buffer is filled or EOF is encountered. This means default version exists and implemented. But it is not.
Issue is not new: stackoverflow.com/.../iostream-keil-c-problems developer.mbed.org/.../ST-Nucleo-L152RE-SDCard
While writing this post I've solved problem:
#ifdef __MICROLIB /*__CC_ARM*/ /// To suppress MDK-ARM Linker Error: L6218E: Undefined symbol __fread_bytes_avail (referred from ios.o). size_t __fread_bytes_avail(void * __restrict ptr, size_t count, FILE * __restrict stream) //__attribute__((__nonnull__(1,3))) { return -1; } #include <wchar.h> /// To suppress MDK-ARM Linker Error: L6218E: Undefined symbol mbsinit (referred from ios.o). int mbsinit(const mbstate_t * ps) { return -1; } /// To suppress MDK-ARM Linker Error: L6218E: Undefined symbol mbsinit (referred from ios.o). wchar_t *wmemmove(wchar_t * __restrict s1, const wchar_t * __restrict s2, size_t n) //__attribute__((__nonnull__(1,2))) { return NULL; } #endif /*__MICROLIB*/ /*__CC_ARM*/
If your program will use this functions, they should be implemented properly. Look at open source stdlib implementations on the internet.