c++ - 从静态库使用 Boost Asio 时出现访问冲突异常

标签 c++ boost boost-asio

我有一个静态库,它使用 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/

相关文章:

c++ - 使用 CRTP 访问派生类的 protected 成员

c++ - 点光源着色器的怪异行为

c++ - 如何找出哪个 .dylib 文件包含特定的 boost 功能

c++ - 使用 boost 和 asio 运行线程

c++ - 如何迭代 std::string 中的所有正则表达式匹配及其在 c++11 std::regex 中的起始位置?

c++ - 重命名具有相同名称但不同扩展名的文件

c++ - 使用 MSVC 11 (VS 2012) 进行 Boost 编译

c++ - 如何通过 boost::interprocess::message 队列传递复杂对象 ( std::string )

c++ - 使用Boost Asio时获取 “resolve: Host not found (authoritative)”异常

c++ - 为什么 >16KB 的有效负载大小会导致吞吐量(TCP + TLS)大幅下降?