【问题标题】:Unresolved symbol `__imp__iob`, not `__imp___iob`未解析的符号`__imp__iob`,而不是`__imp___iob`
【发布时间】:2018-03-18 22:28:00
【问题描述】:

我正在使用 Visual Studio 2017 编译一个程序,该程序与 libusb 的预编译静态版本链接,可用 here

当我尝试链接它时,我得到了一些未解析的符号,例如 these,答案将我指向 legacy_stdio_definitions.lib,它解决了所有链接器错误除了

unresolved external symbol __imp__iob

This page from Microsoft 谈到legacy_stdio_definitions.lib 并说它提供了__imp___iob,但没有提及__imp__iob(注意不同数量的下划线)。

这是怎么回事?

(另外,是的,混合 CRT 版本是个坏主意,我真的应该从源代码编译 libusb。我知道。)

【问题讨论】:

    标签: visual-c++ msvcrt


    【解决方案1】:

    在 VS2018 - 32bit 上遇到 libusb 相同的问题,这对我有帮助:

    1. Hacky 解决方案:链接器抱怨缺少一些函数——所以给它吧——这样的函数应该返回定义的实现IO function pointers。对于静态链接的 libusb-1.0,我必须在我的代码中添加以下内容:

      #pragma comment(lib, "legacy_stdio_definitions.lib")
      #ifdef __cplusplus
      FILE iob[] = { *stdin, *stdout, *stderr };
      extern "C" {
          FILE * __cdecl _iob(void) { return iob; }
      }
      #endif
      
    2. 更好的解决方案: 只需在 VS 2018(我假设您也在使用)下重新编译静态库并仔细阅读随附的自述文件。

    【讨论】:

    • 是的,最后我放弃了,自己编译了libusb。
    猜你喜欢
    • 2016-02-03
    • 1970-01-01
    • 1970-01-01
    • 2010-12-15
    • 1970-01-01
    • 1970-01-01
    • 2011-02-09
    相关资源
    最近更新 更多