在Visual Studio 2012下,使用FTDI API可以很好地进行编译和链接。

但在VS 2014下,它提供了:

Error LNK2019: unresolved external symbol ___iob_func referenced in function "void __cdecl Padding(int)"

标准库是否已更改?

最佳答案

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

该问题在this question的答案中进行了描述。

罪魁祸首是void __cdecl Padding(int)devcon.obj中的ftd2xx.lib函数。它引用作为宏给出的stdinstdoutstderr之一。这些宏的内容已更改。

由于我们实际上并不希望FTDI库提供任何I/O,因此我们不妨提供最简单的实现:

FILE* __cdecl _imp____iob_func() { return 0; }

如果您想要一个能够实现其预期功能的版本:
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;
}

关于c++ - 错误LNK2019 : unresolved external symbol ___iob_func referenced in function "void __cdecl Padding(int)",我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26006359/

10-10 21:27