【问题标题】:Visual Studio 15 __imp___iob, __imp___pctype, __imp___mb_cur_maxVisual Studio 15 __imp___iob,__imp___pctype,__imp___mb_cur_max
【发布时间】:2015-10-11 08:20:55
【问题描述】:

我正在尝试在 Visual Studio 中使用用 mingw 编译的库。但是,我收到以下链接器错误:

错误 LNK2001:未解析的外部符号 __imp___iob

错误 LNK2019:函数中引用了无法解析的外部符号 __imp___pctype

错误 LNK2019:函数中引用了未解析的外部符号 __imp____mb_cur_max

错误 LNK2001:无法解析的外部符号 _fprintf

我能够通过链接到 legacy_stdio_definitions.lib 来修复 _fprintf 错误:unresolved external symbol __imp__fprintf and __imp____iob_func, SDL2

但是,我不知道如何修复其他三个未解决的外部问题。我怎样才能解决这个问题?这些库在 Visual Studio 2013 下完美运行。

编辑:

好的,这是更新。我将 libmsvcrt.a 从 mingw lib 文件夹移到 Visual Studio 中,并将其添加到链接器设置中。现在它似乎可以正常工作了。

【问题讨论】:

  • MinGW 团队有很多工作要做,以使他们的 .h 文件与 CRT 的 VS2015 版本兼容。不要为此屏住呼吸,你可能会被 VS2013 版本卡住一段时间。
  • 在我标记以下答案之前,是否有任何快速破解方法可以让它工作?根据这个:stackoverflow.com/questions/30412951/…,可以通过定义 __imp___iob 返回某种数组来解决 __imp___iob 错误。如何修复其他两个链接器错误以及如何定义该数组?
  • 您只会以一种很难诊断的方式破坏 C 运行时函数。不要去那里。
  • 我在不小心尝试用x64库编译x86项目时也发现了这种问题。

标签: c++ linker visual-studio-2015 legacy stdio


【解决方案1】:

这些库是针对旧版本的 CRT 编译的。您获得的未解析符号是已编译库中存在的 CRT 的内部符号。您必须针对 VS2015 CRT(通用 CRT)重新编译库。但我不确定 MinGW 是否支持这个。

如果做不到,就得继续使用VS2013编译器。 (您可以通过在项目选项中将工具集设置为 vs2013 来使用 VS2015 IDE。但您仍将受限于 2013 编译器支持的 C++ 功能。)

【讨论】:

  • 猜猜我得等到mingw更新了。我希望有一种方法可以使用 Visual Studio 的 makefile 项目功能来构建这些库,但我无法让 ./configure 工作。
  • 好的,这是更新。我将 libmsvcrt.a 从 mingw lib 文件夹移到 Visual Studio 中,并将其添加到链接器设置中。现在它似乎工作正常。这样做有什么缺点吗?无论如何,必须将 mingw 的 libgcc.a 添加到 VS 才能使用使用 mingw 编译的 lib,所以我不这么认为
  • 是的。缺点是库和您的程序使用不同的 CRT。可能发生的一些更有趣的效果:如果库调用 malloc,则程序对该指针的 free 调用可能会崩溃,反之亦然;库和您的程序具有单独的全局语言环境。
【解决方案2】:

我遇到了同样的问题(使用静态 CRT 而不是 DLL 中的 CRT 编译的库)我设法通过更改项目属性中的以下两个参数使其工作:

  • 链接器 > 输入 > 忽略特定的默认库:libc.lib
  • C/C++ > 代码生成 > 运行时库:多线程调试 (/MTd)

如果这还不够,以下页面还有更多内容:https://social.msdn.microsoft.com/Forums/en-US/841e5723-bce4-4340-b7b3-027dcdf90f00/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-14
    • 1970-01-01
    • 1970-01-01
    • 2017-02-22
    • 1970-01-01
    • 2019-01-11
    • 1970-01-01
    相关资源
    最近更新 更多