2017-01-03 2 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; 
} 

하고, 여기

// 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

+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

:

당신은 소스와 여기에 VS2015 솔루션을 다운로드 할 수 있습니다. Visual Studio 프로젝트를 만들 때 미리 컴파일 된 헤더를 선택하면이 파일이 자동 생성됩니다.

관련 문제