我有一个静态库,它使用 Boost Asio 库(版本 1.61.0.)。这个库有一个带有以下构造函数的客户端类:
Client::Client(std::shared_ptr<boost::asio::io_service> io_service_prm, std::string host_prm, int port_prm) : io_service_(io_service_prm), host_(host_prm), port_(port_prm)
{
socket_ = std::make_shared<boost::asio::ip::tcp::socket>(*io_service_);
}
并且有一些回调方法和一个 init() 方法:
int Client::init() {
resolver_ = std::make_shared <boost::asio::ip::tcp::resolver>(*io_service_);
resolver_->async_resolve({ host_, boost::lexical_cast<std::string>(port_) }, std::bind(&Client::resolveHandler, this, std::placeholders::_1, std::placeholders::_2));
return 0;
}
当我在测试程序中链接到这个库,并实例化一个客户端,然后调用它的 init 方法时,程序在 Boost 中的以下位置(win_mutex.cpp,第 50 行)抛出访问冲突异常:
// Lock the mutex.
void lock()
{
--> ::EnterCriticalSection(&crit_section_);
}
这是主要功能的代码:
int main()
{
auto io_service = std::make_shared<boost::asio::io_service>();
auto worker = boost::asio::io_service::work(*io_service);
auto host = "localhost";
auto port = 8181;
Client client(io_service, host, port);
client.init();
io_service->run();
return 0;
}
如果我直接将客户端代码编译为可执行文件,则不会出现此问题。
谁能告诉我如何在这种情况下正确使用 Boost Asio 库?该程序必须在 Windows 上运行,因此非常感谢针对此操作系统的解决方案。
您可以在此处下载源代码和 VS2015 解决方案: https://drive.google.com/open?id=0ByS95lLWpDcQeTYtSGdmLXVoTGc
最佳答案
通过在静态库的“Client.h”头文件中包含“targetver.h”解决。如果您在创建 Visual Studio 项目时选中预编译 header ,则会自动生成此文件。
关于c++ - 从静态库使用 Boost Asio 时出现访问冲突异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41445870/