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

Dev*_*ion 7 windows gcc mingw g++ c++11

我刚开始使用MinGW for Windows.尝试使用时创建可执行文件

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

对于以下代码:

#include <string>

using namespace std;

int main()
{
    string x = to_string(123);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

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
Run Code Online (Sandbox Code Playgroud)

导致此错误的根本原因是什么?如何让它消失?虽然我可以轻松找到to_string()功能的替代品,但我不确定是什么原因导致此错误发生.

tho*_*mes 16

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


SiZ*_*OUS 10

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

查了很多资料,在官方邮件列表中找到了解决方法。

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

mingw-get upgrade mingwrt=5.2.1
Run Code Online (Sandbox Code Playgroud)

然后重启MinGW shell。

在这里阅读完整的故事

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


小智 7

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

  1. 下载mingw-w64-install.exe
  2. 设置为版本:6.3.0,体系结构:i686,线程:posix,例外:矮级和内部版本:2。

我希望这会有所帮助。


小智 7

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

  • 请注意,此方法意味着您会由于将stdio功能移交给MSVCRT而收到大量错误。 (3认同)