This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

C++ iostream error. Undefined symbols from ios.o

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.