MinGW g++:使用 to_string 时 vsnprintf 的多重定义

MinGW g++: Multiple definition of vsnprintf when using to_string

我刚开始使用 MinGW Windows。尝试使用

创建可执行文件时

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

以下代码:

#include <string>

using namespace std;

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

我收到以下错误:

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

这个错误的根本原因是什么?我怎样才能让它消失?虽然我可以很容易地找到 to_string() 函数的替代品,但我不确定首先导致此错误发生的原因。

我使用 MinGW w64 编译器解决了这个问题

  1. 下载mingw-w64-install.exe
  2. 设置为版本:6.3.0,体系结构:i686,线程:posix,异常:dwarf 和构建版本:2.

希望对您有所帮助。

vsnprintfstdio.hlibmingwex.a中都有多个定义。我可以通过在代码的开头添加 #define __USE_MINGW_ANSI_STDIO 0 来解决这个问题,在任何包含之前,这会禁用 stdio.h.

vsnprintf 的定义

安装 MinGW 软件包 mingw32-libmingwex-* 将 link 一个合适的 vsnprintf 版本并避免 link 错误。

这个问题,即 multiple definition of vsnprintf,在 2019 年 12 月 MinGW 中仍然存在。

经过大量调查后,我在 official mailing list 中找到了解决方案。

这是 mingwrt-5.2.2 中的错误。降级到 mingwrt-5.2.1 版本可以解决该问题。 为此,只需输入以下命令:

mingw-get upgrade mingwrt=5.2.1

然后重启MinGW shell。

Read the full story here.

注意: MinGW-w64 和 MinGW 是独立的项目,所以接受的解决方案对我帮助不大,因为我想保留 MinGW 而不是迁移到 MinGW- w64.