【问题标题】:MinGW g++: Multiple definition of vsnprintf when using to_stringMinGW g++:使用 to_string 时对 vsnprintf 的多重定义
【发布时间】:2017-09-03 19:18:17
【问题描述】:

我刚开始使用 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;
}

我收到以下错误:

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 安装坏了。

标签: windows c++11 gcc g++ mingw


【解决方案1】:

截至 2019 年 12 月,MinGW 中仍然存在此问题,即 multiple definition of vsnprintf

查了很多,在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。

【讨论】:

    【解决方案2】:

    安装MinGWmingw32-libmingwex-* 将链接适当版本的vsnprintf 并避免链接器错误。

    【讨论】:

    • 这不是警告;这是破坏构建的链接器错误。
    【解决方案3】:

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

    【讨论】:

    • 请注意,这种方法意味着由于 stdio 功能被移交给 MSVCRT,您会遇到一堆错误
    【解决方案4】:

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

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

    我希望这会有所帮助。

    【讨论】:

    • 是的,降级是解决方案。我使用了mingw32-8.2.0并降级为mingw-w64-7.1.0
    猜你喜欢
    • 2016-07-28
    • 2012-10-10
    • 2020-12-03
    相关资源
    最近更新 更多