在用 VS2015的cl.exe编译如下代码( boost asio 示例 )时,总是出现 throw_exception unresolved (link error)
x.obj : error LNK2019: unresolved external symbol "void __cdecl boost::throw_exception(class std::exception const &)" (?throw_exception@boost@@YAXABVexception@std@@@Z) referenced in function "void __cdecl boost::asio::detail::do_throw_error(class boost::system::error_code const &,char const *)" (?do_throw_error@detail@asio@boost@@YAXABVerror_code@system@3@PBD@Z)
初步查询资料得知是因定义了BOOST_EXCEPTION_DISABLE引起,在此宏被定义后需要用户自定义如下函数
void throw_exception( std::exception const & e );
这样定义一个函数,就有了第一个解决方案
1. 可以定义一个函数throw_exception
可是看上去挺别扭,继续搜,发现boost/config/compiler下有visualc.hpp,其中涉及BOOST_NO_EXCEPTIONS的部分如下
#if !defined(_CPPUNWIND) && !defined(BOOST_NO_EXCEPTIONS)
# define BOOST_NO_EXCEPTIONS
#endif
那么就有了.
2. 若要避免BOOST_EXCEPTION_DISABLE被定义,需要定义_CPPUNWIND,在文件中定义即可
继续_CPPUNWIND ,msdn中说
_CPPUNWIND Defined for code compiled with Enable Exception
Handling (/GX).
按照所说的使用选项/GX,结果又出现新情况
3. 或者在编译选项中使用/GX 或是 /EHsc,这样告诉编译器ENABLE EXCEPTION HANDLE,也可以。
最后一种方法最自然做个笔记。
//#define _CPPUNWIND
#include <iostream>
#include <boost/asio.hpp>
using namespace boost::asio;
/*
void boost::throw_exception( std::exception const & e )
{
}
*/
int main(int argc, char* argv[])
{
// 所有asio类都需要io_service对象
io_service iosev;
ip::tcp::acceptor acceptor(iosev,
ip::tcp::endpoint(ip::tcp::v4(), 1000));
for(;;)
{
// socket对象
ip::tcp::socket socket(iosev);
// 等待直到客户端连接进来
acceptor.accept(socket);
// 显示连接进来的客户端
std::cout << socket.remote_endpoint().address() << std::endl;
// 向客户端发送hello world!
boost::system::error_code ec;
socket.write_some(buffer("hello world!"), ec);
// 如果出错,打印出错信息
if(ec)
{
std::cout <<
boost::system::system_error(ec).what() << std::endl;
break;
}
// 与当前客户交互完成后循环继续等待下一客户连接
}
return 0;
}