提升 ASIO 1.66 示例无法构建 - async_connect() 需要单个迭代器无法在 VS2010 上链接



当我尝试编译从asio网站获取的示例SSL客户端程序时,使用多线程调试,多字节字符集配置,出现链接器错误:

asioclient2010.obj : 错误 LNK2019: 未解析的外部符号"void __cdecl boost::asio::async_connect,class boost::_bi::bind_t,class boost::_bi::list2,struct boost::arg<1>>>>(class boost::asio::basic_socket &,class boost::asio::ip::basic_resolver_iterator,class boost::_bi::bind_t,class boost::_bi::list2,struct boost::arg<1>>> 常量 &,void *)" (??$async_connect@Vtcp@ip@asio@boost@@V?$basic_resolver_iterator@Vtcp@ip@asio@boost@@@234@V?$bind_t@XV?$mf1@XVclient@@ABVerror_code@system@boost@@@_mfi@boost@@V?$list2@V?$value@PAVclient@@@_bi@boost@@U?$arg@$00@3@@_bi@3@@_bi@4@@asio@boost@@YAXAAV?$basic_socket@Vtcp@ip@asio@boost@@@01@V?$basic_resolver_iterator@Vtcp@ip@asio@boost@@@ip@01@ABV?$bind_t@XV?$mf1@XVclient@@ABVerror_code@system@boost@@@_mfi@boost@@V?$list2@V?$value@PAVclient@@@_bi@boost@@U?$arg@函数"public: 00@3@@_bi@3@@_bi@1@PAX@Z__thiscall client::client(class boost::asio::io_context &,class boost::asio::ssl::context &,class boost::asio::ip::basic_resolver_iterator)" (??0client@@QAE@AAVio_context@asio@boost@@AAVcontext@ssl@23@V?$basic_resolver_iterator@Vtcp@ip@asio@boost@@@ip@23@@Z)

如果我将其构建为VS2017项目,则链接良好。我猜这是提升版本的问题?

与VS2010兼容的最新版本的加速是什么?

http://think-async.com/Asio/boost_asio_1_10_6/doc/html/boost_asio/example/cpp03/ssl/client.cpp

What is the latest version of boost that is compatible with VS2010?

最新版本的 boost (1.66.0) 是兼容的。


除此之外,您必须至少在Linker -> Additional Library Directories设置中指定 boost 版本的库目录。

对于SSL,您还必须在链接器/命令行中指定库路径和相应的库文件。当前版本的boost也与较新的SSL版本(1.1.0#)兼容,因此这也不是问题。

下载二进制文件时,可以检查DEPENDENCY_VERSIONS.txt内的依赖项。

Microsoft Visual Studio 2010 - msvc-10.0 - Service Pack 1

此处提供了链接器的 SSL 其他库目录和命令行作为示例。这些取决于您的安装和版本 - 在这里我使用的是OpenSSL 1.1.0f 64位。

SSL 附加库目录:

C:\OpenSSL-Win64\lib

命令行:

"libssl.lib" "libcrypto.lib">

事实证明,采用单个迭代器的async_connect版本无法在VS2010上链接。

boost::asio::async_connect(socket_.lowest_layer(), 
endpoint_iterator,
boost::bind(&client::handle_connect, 
this,
boost::asio::placeholders::error));

根据文档:

此重载假定默认构造的对象类型为 迭代器表示序列的结束。这是一个有效的 迭代器类型的假设,例如 boost::asio::ip::tcp::resolver::iterator.

调用 async_connect 的第二个重载并显式传入结束迭代器可以解决此问题:

boost::asio::ip::tcp::resolver::iterator dummy_end_iterator;
boost::asio::async_connect(socket_.lowest_layer(),
endpoint_iterator, dummy_end_iterator,
boost::bind(&client::handle_connect, 
this,
boost::asio::placeholders::error));

http://www.boost.org/doc/libs/1_66_0/doc/html/boost_asio/reference/async_connect.html

最新更新