2013-03-21 2 views
1

VS2010 - 64bit에서 Boost Asio에 대한 다음 코드 예제를 실행하려고합니다. Linkboost asio의 링커 문제

#include <boost/asio.hpp> 
#include <boost/array.hpp> 
#include <iostream> 
#include <string> 

boost::asio::io_service io_service; 
boost::asio::ip::tcp::resolver resolver(io_service); 
boost::asio::ip::tcp::socket sock(io_service); 
boost::array<char, 4096> buffer; 

void read_handler(const boost::system::error_code &ec, std::size_t bytes_transferred) 
{ 
    if (!ec) 
    { 
     std::cout << std::string(buffer.data(), bytes_transferred) << std::endl; 
     sock.async_read_some(boost::asio::buffer(buffer), read_handler); 
    } 
} 

void connect_handler(const boost::system::error_code &ec) 
{ 
    if (!ec) 
    { 
     boost::asio::write(sock, boost::asio::buffer("GET/HTTP 1.1\r\nHost: highscore.de\r\n\r\n")); 
     sock.async_read_some(boost::asio::buffer(buffer), read_handler); 
    } 
} 

void resolve_handler(const boost::system::error_code &ec, boost::asio::ip::tcp::resolver::iterator it) 
{ 
    if (!ec) 
    { 
     sock.async_connect(*it, connect_handler); 
    } 
} 

int main() 
{ 
    boost::asio::ip::tcp::resolver::query query("www.highscore.de", "80"); 
    resolver.async_resolve(query, resolve_handler); 
    io_service.run(); 
} 

에서 촬영 그때 시작하기 나는 다음과 같은 오류를 받기 시작했다 그래서 Link

에서 이러한 파일을 다운로드

이러한 문제를 해결하기 위해
cannot open file 'libboost_system-vc100-mt-sgd-1_47.lib' 
cannot open file 'libboost_date_time-vc100-mt-sgd-1_47.lib' 
cannot open file 'libboost_regex-vc100-mt-sgd-1_47.lib' 

다음과 같은 오류 :

Error 12 error LNK1169: one or more multiply defined symbols found 
Error 8 error LNK2005: "void * __cdecl operator new(unsigned int)" ([email protected]@Z) already defined in LIBCMTD.lib(new.obj) 
Error 10 error LNK2005: "void * __cdecl operator new[](unsigned int)" ([email protected]@Z) already defined in libcpmtd.lib(newaop.obj)  
Error 9 error LNK2005: "void __cdecl operator delete(void *)" ([email protected]@Z) already defined in LIBCMTD.lib(dbgdel.obj) 
Error 11 error LNK2005: "void __cdecl operator delete[](void *)" ([email protected]@Z) already defined in LIBCMTD.lib(delete2.obj) 

mi 잘못된 것 같아. 추가 종속성에서 일부 입력을 설정해야합니까?

+0

포함 된 헤더와 컴파일러에 전달 된 명령 행 플래그를 표시하지 않았습니다. 귀하의 질문에 그것들을 추가하면 도움이 될 것입니다. 링커 오류는 여러 객체 파일에 동일한 기능의 정의가 있기 때문에 발생합니다. –

+0

VS2010 용 명령 줄 플래그는 어떻게 구합니까? – Rajeshwar

+1

좋은 질문입니다. 일부 Visual Studio 사용자가 도움이 될 것입니다.이 오류를 없애기위한 간단한 방법은 부스트 ​​라이브러리를 제거한 다음 다시 설치하는 것입니다 (확실하지는 않습니다). Windows에서 응용 프로그램을 다시 설치하는 것이 실제로 효과가 있다는 것을 알게되었습니다. –

답변

0

Visual Studio를 다시 설치하지 않아도됩니다. 나는 당신이보고있는 오류가 버전 문제와 관련이 있다고 생각한다. 오류는 일부 구성 요소가 한 세트의 라이브러리로 빌드되었고 다른 구성 요소는 다른 라이브러리 세트로 빌드되었음을 나타냅니다. 오류 :

error LNK2005: "void * __cdecl operator new(unsigned int)" ([email protected]@Z) already defined in LIBCMTD.lib(new.obj) 

파일 이름의 마지막 3 문자는 멀티 스레드 라이브러리를 나타냅니다. MT (멀티 스레드 - 디버그 없음) 또는 MDd (DLL의 다중 스레드 디버그)와 같이 다른 유형의 라이브러리에서이 코드를 사용하는 다른 구성 요소를 빌드하는 경우이 오류가 발생합니다. Boost에 대해 잘못된 라이브러리 세트로 링크하는 경우에도이 오류가 발생할 수 있습니다. 사실, 그것을 사용하려고하는 라이브러리 위의 오류에서입니다 :

'libboost_system-vc100-MT-SGD-1_47.lib'나는 릴리스 버전이라고 생각

. 자신의 코드에서 사용하는 것과 동일한 유형의 라이브러리로 빌드해야합니다. MTD를 사용하고 있다면, Boost 라이브러리의 MTD 버전으로 빌드하십시오.

프로젝트가 사용중인 라이브러리를 보려면 솔루션 탐색기 윈도우에서 프로젝트를 마우스 오른쪽 단추로 클릭하고 속성을 선택하십시오. 프로젝트 메뉴에서도 속성을 선택할 수 있지만 편집 작업 창에서 현재 파일이 열려있는 상태에서 해당 프로젝트에 파일이 있는지 확인하십시오. 런타임 라이브러리에 사용중인 라이브러리 유형이 표시됩니다. 프로젝트 유형이 dll이면이 값을 실제로 MDd로 설정해야합니다. 어떤 유형의 프로젝트인지 보려면 속성에서 링커 (또는 라이브러리 관리자) 옵션을 클릭하고 출력 파일이 dll이면 프로젝트 유형은 dll입니다. 라이브러리 또는 exe라고하면 프로젝트는 각각 라이브러리 또는 exe입니다. 주어진 유형의 모든 프로젝트는 동일한 방식으로 구축되어야합니다. 예를 들어 릴리스 및 디버그 버전을 혼합하고 일치시키지 마십시오. 구축중인 exe를 가지고 있다면 라이브러리 유형의 프로젝트를 빌드하는 데 사용 된 라이브러리를 사용하십시오. 라이브러리를 설정하려면 등록 정보에서 구성 등록 정보/C/C++/코드 생성/런타임 라이브러리를 선택하고 드롭 다운 상자에서 유형을 선택하십시오.

모든 프로젝트의 구성이 올바른 것처럼 보이는 경우 처음부터 다시 시도하십시오. 이 작업은 프로젝트를 마우스 오른쪽 버튼으로 클릭하고 clean을 선택한 다음 rebuild를 선택하여 수행 할 수 있습니다.