VS2017编译C++程序遇LNK2001未解析外部符号___iob_func求助
解决VS2017中libeay32.lib链接错误___iob_func未解析的问题
我之前也碰到过几乎一模一样的情况!这种链接错误大概率是因为你用的libeay32.lib是用旧版本Visual Studio(比如VS2012,也就是你看到的Visual Studio 11.0)编译的,和VS2017的C运行时库(CRT)存在兼容性冲突。
为什么VS2015的修复方案没用?
VS2015到VS2017之间,微软对CRT做了更彻底的重构,旧的针对stdin/stdout/stderr的重定义方案已经无法适配新的CRT结构了,尤其是当静态库的编译环境比VS2015还老的时候,这个问题会更突出。
给你几个可行的解决方案:
- 优先方案:使用适配VS2017的libeay32库
- 尽量找专门针对VS2017编译的OpenSSL预编译包,不要用通用版或者旧VS版本的包。
- 如果能拿到OpenSSL的源码,直接用VS2017的开发者命令提示符编译源码,生成的
libeay32.lib会完美适配当前环境,从根源解决问题。
- 临时兼容方案:手动映射符号
如果暂时找不到适配的库,可以在你的项目里随便找一个cpp文件,添加这段代码来强制映射符号:
这个方法能绕开链接错误,但要注意不同CRT版本的内部实现可能有差异,只建议作为临时解决方案。#include <cstdio> extern "C" { FILE __iob_func[3] = { *stdin, *stdout, *stderr }; } - 检查项目路径配置
你提到跳转stdin定义到VS11.0目录,说明你的项目可能不小心引入了旧VS版本的包含路径。去项目属性的「VC++目录」里:- 把VS2017的包含目录(比如
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\<具体版本号>\include)移到最顶部,确保优先用当前VS的头文件。 - 同时清理库目录里的旧VS路径,避免链接到不匹配的CRT库。
- 把VS2017的包含目录(比如
很多开发者升级VS版本后都会遇到这种旧静态库的兼容性问题,尤其是OpenSSL这类常用库,版本和编译环境的匹配真的很重要。如果能自己编译源码,这肯定是最稳妥的办法。
内容的提问来源于stack exchange,提问作者Chris H Baker
相关产品推荐
相关产品推荐

