MinGW g++: Multiple definition of vsnprintf when u

2020-02-03 08:36发布

问题:

I just started using MinGW for Windows. When trying to create executable using

g++ a.cpp -o a.exe -std=c++14

for the code below:

#include <string>

using namespace std;

int main()
{
    string x = to_string(123);
    return 0;
}

I'm getting following error:

C:/mingw/bin/../lib/gcc/mingw32/5.3.0/../../../libmingwex.a(vsnprintf.o):(.text+0x0): multiple definition of vsnprintf
C:\Users\..\Local\Temp\cc4sJDvK.o:c:/mingw/include/stdio.h:426: first defined here
collect2.exe: error: ld returned 1 exit status

What is the root cause for this error and how can I make it go away? While I can easily find a replacement for to_string() function I'm not sure what is causing this error to occur in the first place.

回答1:

I solved this issue using MinGW w64 compiler

  1. download mingw-w64-install.exe
  2. setup to Version: 6.3.0, Architecture: i686, Threads: posix, Exception: dwarf and Build revision: 2.

I hope this will be of some help.



回答2:

Installing MinGW packages mingw32-libmingwex-* will link an appropriate version of vsnprintf and avoid the linker error.



回答3:

There are multiple definitions of vsnprintf in both stdio.h and libmingwex.a. I am able to work this around by adding #define __USE_MINGW_ANSI_STDIO 0 to the start of the code, before any includes, which disables the definition of vsnprintf in stdio.h.



回答4:

This issue, i.e. multiple definition of vsnprintf, still exists in MinGW as December 2019.

After investigating a lot, I found the solution in the official mailing list.

It's a bug in mingwrt-5.2.2. Downgrading to the mingwrt-5.2.1 version solves that issue. To do that, just input the following command:

mingw-get upgrade mingwrt=5.2.1

Then restart the MinGW shell.

Read the full story here.

Note: MinGW-w64 and MinGW are separate projects, so the accepted solution is not so helpful to me, as I want to keep MinGW and not to move to MinGW-w64.