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
当我尝试使用多线程调试、多字节字符集配置编译取自 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