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.

Parents Reply Children
  • Hi Reinhard,

    I am facing same errors when I add few C++ files in my project, that was building fine before that. So as per your post, I have tried to disable MicroLIB as follows:

    1. Open "Option for target"
    2. On 'Target' tab, uncheck the 'Use MicroLIB' option in 'Code Generation' section.
    3. Then rebuild all target files.

    Then I programmed the STM32L152ZD based EVAL board with the generated object code. But the board stops working.

    Am I disabling it correctly? Do I need to do anything else?

    Please help me here.

    Thanks,
    Dhaval