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
請編輯您的問題以包含一個[MCVE],即代碼可以複製,粘貼和編譯,無需進一步修改。您的問題也缺少重要細節:(1)發生訪問衝突的確切位置? (2)你正在使用哪種增強版本? (3)如果'Client'不在靜態庫中,而是直接編譯到可執行文件中,問題是否也會發生? –
您的問題似乎與此類似:http://stackoverflow.com/questions/39772075/boost-asio-if-condition-evaluated-differently-in-static-lib-and-dll-compilations –