MinGW g++:使用to_string时出现vsnprintf的多重定义问题

11

我刚开始使用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() 函数的方法,但我不确定是什么导致了这个错误的发生。


1
听起来你的MinGW安装有问题。 - SurvivalMachine
4个回答

25

安装MinGW软件包mingw32-libmingwex-*将链接适当版本的vsnprintf并避免链接器错误。


这不是一个警告,而是一个链接器错误,会导致构建失败。 - Lightness Races in Orbit

11

此问题,即“vsnprintf的多次定义”,在MinGW中仍然存在于2019年12月。

经过大量调查后,我在官方邮件列表中找到了解决方法。

这是mingwrt-5.2.2中的一个错误。将其降级到mingwrt-5.2.1版本即可解决此问题。 只需输入以下命令即可:

mingw-get upgrade mingwrt=5.2.1

然后重新启动MinGW shell。

在这里阅读完整的故事

注意:MinGW-w64和MinGW是分开的项目,所以接受的解决方案对我来说没有太大帮助,因为我想保持使用MinGW而不是转移到MinGW-w64。


7

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

  1. 下载mingw-w64-install.exe
  2. 设置版本为:6.3.0,架构为:i686,线程为:posix,异常为:dwarf,构建修订版为:2。

希望这能对您有所帮助。


是的,降级是解决方案。我使用了mingw32-8.2.0,然后降级到mingw-w64-7.1.0。 - phen0menon

7

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


4
请注意,这种方法会导致由于stdio功能被移交给MSVCRT而出现大量的漏洞。 - M.M

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接