从静态库

时间:2017-01-03 14:34:40

标签: c++ boost boost-asio

我有一个静态库,它使用Boost Asio lib(版本1.61.0。)。该库有一个Client类,其中包含以下构造函数:

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

1 个答案:

答案 0 :(得分:1)

解决方案包括&#39; targetver.h&#39;在&#39; Client.h&#39;静态库的头文件。如果在创建Visual Studio项目时检查预编译头,则会自动生成此文件。