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;
}
하고, 여기
// Lock the mutex.
void lock()
{
--> ::EnterCriticalSection(&crit_section_);
}
이의 코드입니다 : 클라이언트의 인스턴스를, 다음은 init 메소드의 호출 프로그램이 액세스 위반 부스트의 다음 위치에서 예외 (win_mutex.cpp, 라인 (50))를 던졌습니다 주요 기능 :
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에 대한 솔루션을 매우 높이 평가할 것입니다. 정적 라이브러리의 'Client.h'헤더 파일 'targetver.h'를 포함하여 해결 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 –