未解决的符号`__imp__iob`,而不是`__imp ___ iob`

时间:2018-03-18 22:28:01

标签: visual-c++ msvcrt

我正在使用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。我知道。)

1 个答案:

答案 0 :(得分:0)

在VS2018 - 32bit上与libusb有同样的问题,这对我有帮助:

  1. Hacky解决方案:链接器抱怨某些功能缺失 - 所以只需将其提供给它 - 这样的函数应该返回定义的实现{{3} }。对于静态链接的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下重新编译静态库(我假设您也在使用它)并仔细阅读附带的自述文件。