如何在Visual Studio 2019中使用C++链接OpenSSL库及解决LNK2001错误
问题原因定位
你遇到的LNK2001错误均属于系统依赖库缺失,报错的__imp_gethostbyname是Windows套接字标准接口,OpenSSL的crypto库编译时默认依赖该接口对应的系统库,你当前的链接配置只加了OpenSSL本身的两个库,没有补充依赖的系统库,所以触发批量符号未定义错误。
排查解决步骤
1. 补充缺失的系统依赖库
打开项目属性页,进入链接器 -> 输入 -> 附加依赖项,在原有libcrypto.lib、libssl.lib的基础上,新增以下系统库:
ws2_32.lib:套接字接口依赖,解决gethostbyname这类网络相关符号未定义错误advapi32.lib:加密服务相关接口依赖,解决crypto库中加密相关系统调用符号错误crypt32.lib:证书相关接口依赖,解决SSL证书校验相关符号错误user32.lib:用户态基础接口依赖,部分版本OpenSSL会用到该库接口
如果你编译的是静态版本的OpenSSL,还需要额外添加
libcmt.lib(Release配置)或libcmtd.lib(Debug配置),如果出现MSVCRT冲突,对应调整运行库选项为多线程(/MT)或多线程调试(/MTd)即可。
2. 校验OpenSSL编译架构与项目架构匹配
- 确认你编译OpenSSL时选择的架构(x86/x64/ARM)和当前VS项目的目标架构完全一致,架构不匹配也会触发同类符号未定义错误
- 确认OpenSSL的编译配置(Debug/Release)和当前项目配置匹配,Debug版本的OpenSSL只能链接Debug项目,Release同理,混用会出现链接错误
- 如果你用的是预编译的OpenSSL二进制包,确认包对应的VS版本和你当前使用的VS版本兼容,跨大版本(比如VS2015编译的OpenSSL给VS2022用)大概率会出现链接异常
3. 排查静态/动态链接配置冲突
如果你编译OpenSSL时选择的是动态链接(生成了libcrypto.dll、libssl.dll和对应的导入库),需要确认项目预处理器定义中添加了OPENSSL_USE_APPLINK,同时将dll文件放到生成的可执行文件同目录下,避免运行时找不到库的问题。
如果是静态编译的OpenSSL,需要确认预处理器定义中添加了OPENSSL_STATIC,避免导入导出符号不匹配的问题。
内容的提问来源于stack exchange,提问作者DarkCoder
相关产品推荐
相关产品推荐

