簡體   English   中英

從靜態庫使用Boost Asio時發生訪問沖突異常

[英]Access violation exception when using Boost Asio from a static library

我有一個靜態庫,該庫使用Boost Asio庫(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;
}

當我在測試程序中鏈接到該庫並實例化一個Client,然后調用它的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上運行,因此,我將不勝感激此OS的解決方案。

您可以在此處下載源代碼和VS2015解決方案: https ://drive.google.com/open?id = 0ByS95lLWpDcQeTYtSGdmLXVoTGc

通過在靜態庫的“ Client.h”頭文件中包含“ targetver.h”來解決。 如果在創建Visual Studio項目時選中“預編譯”頭,則會自動生成此文件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM