boost asio 1.66 示例无法构建 - async_connect() 采用单个迭代器在 VS2010 上无法 link

boost asio 1.66 examples won't build - async_connect() which takes a single iterator fails to link on VS2010

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

asioclient2010.obj : error LNK2019: unresolved external symbol "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> > > const &,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@[=12=]@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@[=12=]@3@@_bi@3@@_bi@1@PAX@Z) referenced in function "public: __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 项目,它链接正常。我猜是boost版本的问题?

兼容VS2010的boost最新版本是什么?

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?

The latest version of boost (1.66.0) is compatible.


除此之外,您必须至少在 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 上无法 link。

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

根据文档:

This overload assumes that a default constructed object of type Iterator represents the end of the sequence. This is a valid assumption for iterator types such as 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