2017-01-03 52 views
0

我有一個使用Boost Asio lib(版本1.61.0)的靜態庫。該庫有以下構造一個客戶端類:從靜態庫中使用Boost Asio時出現訪問衝突異常

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方法,程序拋出在以下位置中升壓訪問衝突異常(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

請編輯您的問題以包含一個[MCVE],即代碼可以複製,粘貼和編譯,無需進一步修改。您的問題也缺少重要細節:(1)發生訪問衝突的確切位置? (2)你正在使用哪種增強版本? (3)如果'Client'不在靜態庫中,而是直接編譯到可執行文件中,問題是否也會發生? –

+0

您的問題似乎與此類似:http://stackoverflow.com/questions/39772075/boost-asio-if-condition-evaluated-differently-in-static-lib-and-dll-compilations –

回答

1

通過在靜態庫「Client.h」頭文件「targetver.h」解決。如果在創建Visual Studio項目時檢查預編譯頭文件,則會自動生成此文件。