错误LNK2019:函数"void __cdecl Padding(int)"中引用的未解析的外部符号___iob_func

Mik*_*ike 5 c++ visual-studio visual-studio-2015

在Visual Studio 2012下使用FTDI API编译和链接很好.

但在VS 2014下,它给出了:

Error LNK2019: unresolved external symbol ___iob_func referenced in function "void __cdecl Padding(int)"
Run Code Online (Sandbox Code Playgroud)

是否更改了标准库?

Rei*_*ica 1

是的,标准库已更改,并且 FTDI 似乎并不关心 - 至少从 CDM2.12.18 驱动程序版本开始不关心。

这个问题的答案中描述了这个问题。

罪魁祸首是void __cdecl Padding(int)来自devcon.obj内部的功能。ftd2xx.lib它引用以宏形式给出的stdinstdout或 之一stderr。这些宏的内容发生了变化。

由于我们并不真正期望 FTDI 库有任何 I/O,因此我们不妨提供最简单的实现:

FILE* __cdecl _imp____iob_func() { return 0; }
Run Code Online (Sandbox Code Playgroud)

如果您想要一个能够完成其应有功能的版本:

FILE* __cdecl _imp____iob_func()
{
    struct _iobuf_VS2012 { // ...\Microsoft Visual Studio 11.0\VC\include\stdio.h #56
        char *_ptr;
        int   _cnt;
        char *_base;
        int   _flag;
        int   _file;
        int   _charbuf;
        int   _bufsiz;
        char *_tmpfname; };
    // VS2015 has FILE = struct {void* _Placeholder}

    static struct _iobuf_VS2012 bufs[3];
    static char initialized = 0;

    if (!initialized) {
        bufs[0]._ptr = stdin->_Placeholder;
        bufs[1]._ptr = stdout->_Placeholder;
        bufs[2]._ptr = stderr->_Placeholder;
        initialized = 1;
    }

    return (FILE*)&bufs;
}
Run Code Online (Sandbox Code Playgroud)