在 Visual Studio 2012 下使用 FTDI API 可以很好地编译和链接。
但在 VS 2014 下,它给出:
Error LNK2019: unresolved external symbol ___iob_func referenced in function "void __cdecl Padding(int)"
标准库有变化吗?
在 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 驱动程序版本中没有。
该问题在此问题的答案中进行了描述。
void __cdecl Padding(int)
来自devcon.obj
内部的功能ftd2xx.lib
是罪魁祸首。它引用作为宏给出stdin
的stdout
或之一。stderr
这些宏的内容发生了变化。
由于我们并不真正期望 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;
}