VC6编译的静态库,在VC2008下使用报错

           用VC6编译了一个openssl的静态库,然后在VC2008的工程中使用。之前一直可正常使用,今天又新建了一个控制台进程,却编译出错——在链接时提示:

          libeay32.lib(cryptlib.obj) : error LNK2019: 无法解析的外部符号 __iob,该符号在函数 _OPENSSL_showfatal 中被引用
          fatal error LNK1120: 1 个无法解析的外部命令

          baidu了半天,终于找到了根本原因,请看这篇blog文章:   http://www.cppblog.com/sssa2000

          大致的意思就是:VC6和2005(2008也一样)使用的CRT库有变化,VC6中定义

_CRTIMP extern FILE _iob[];
#define stdin (&_iob[0])
#define stdout (&_iob[1])
#define stderr (&_iob[2])

        stdin、stdout、stderr是通过查_iob数组得到的。所以,VC6编译的程序、静态库只要用到了printf、scanf之类的函数,都要链接_iob数组。

        而2005和2008中的,则变成了

_CRTIMP FILE * __cdecl __iob_func(void);
#define stdin (&__iob_func()[0])
#define stdout (&__iob_func()[1])
#define stderr (&__iob_func()[2])

        _iob数组不再是显式的暴露出来了,需要调用__iob_func()函数获得。

        所以vc6的静态库链接VC2005的C运行库就会找不到_iob数组。这时在进程中手工重新定义_iob数组就ok了:

extern "C" FILE _iob[3] = {__iob_func()[0], __iob_func()[1], __iob_func()[2]};

        再次感谢 键盘的咏叹调 的博文:http://www.cppblog.com/sssa2000

 

你可能感兴趣的:(VC6编译的静态库,在VC2008下使用报错)