Visual Studio 2017 C++项目集成OpenSSL与cpprestapi链接错误如何解决
VS2017工具集升级链接错误解决方法
触发错误
项目升级适配Visual Studio 2017工具集标准时,编译抛出如下链接错误:
- LNK2001 unresolved external symbol "public: static class std::basic_string<wchar_t,struct std::char_traits<wchar_t>,class std::allocator<wchar_t> > const web::http::methods::GET" (?GET@methods@http@web@@2V?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@B)
- LNK2019 unresolved external symbol _OPENSSL_add_all_algorithms_noconf referenced in function "public: void __thiscall GatewayManager::EnableGatewayService(void)" (?EnableGatewayService@GatewayManager@@QAEXXZ)
已引入的相关依赖库
已配置的关联lib如下:
- brotlicommon.lib
- brotlidec.lib
- brotlienc.lib
- cpprest_2_10d.lib
- cpprest141_2_10d.lib
- Crypt32.lib
- Httpapi.lib
- libcrypto.lib
- libcurld.lib
- libeay32.lib
- libssl.lib
- mswsock.lib
- netapi32.lib
- ntdsapi.lib
- odbc32.lib
- odbccp32.lib
- Rpcrt4.lib
- secur32.lib
- shlwapi.lib
- ssleay32.lib
- wldap32.lib
- ws2_32.lib
- zlibd.lib
修复方案
不需要额外引入新的库,当前错误由重复引入同功能不同版本的冲突库导致,按如下步骤清理即可:
- 解决LNK2001错误:VS2017对应的工具集版本为v141,你同时引入了通用版本
cpprest_2_10d.lib和v141专用版本cpprest141_2_10d.lib,二者符号定义冲突,删除cpprest_2_10d.lib,仅保留cpprest141_2_10d.lib即可。注意要确保该cpprest库的编译配置和当前项目完全匹配:运行时库选项(MDd/MTd)、目标架构(x86/x64)、字符集(Unicode)均需一致。 - 解决LNK2019错误:你同时引入了OpenSSL 1.1.x及以上版本的库
libcrypto.lib、libssl.lib,和OpenSSL 1.0.x版本的库libeay32.lib、ssleay32.lib,二者符号完全不兼容。OPENSSL_add_all_algorithms_noconf是1.0.x版本的专属函数,1.1.x之后已移除该API:- 如果你沿用旧版OpenSSL 1.0.x,删除
libcrypto.lib、libssl.lib,仅保留libeay32.lib、ssleay32.lib即可 - 如果你要使用新版OpenSSL 1.1.x及以上,删除
libeay32.lib、ssleay32.lib,同时将代码中OPENSSL_add_all_algorithms_noconf调用替换为OPENSSL_init_crypto的对应配置逻辑即可。
- 如果你沿用旧版OpenSSL 1.0.x,删除
内容的提问来源于stack exchange,提问作者Alexander Stoimenov
相关产品推荐
相关产品推荐

