2011-07-26 2 views
7

저는 cmake와 boost 라이브러리를 사용하여 gcc (Linux)에서 msvc (windows)로 큰 프로젝트를 이식하려고합니다.LNK2019 asio 헤더를 포함 할 때, cmake로 생성 된 솔루션

프로젝트 컴파일 및 GCC에 잘 실행하지만 MSVC에 다음과 같은 오류 반환 :

Dyna.obj : error LNK2019: unresolved external symbol "void __cdecl boost::throw_exception(class std::exception const &)" ([email protected]@@[email protected]@@@Z) referenced in function "void __cdecl boost::asio::detail::do_throw_error(class boost::system::error_code const &,char const *)" ([email protected]@[email protected]@@[email protected]@[email protected]@Z) 

내가 부스트 ASIO를 사용하여 간단한 프로젝트를 실행 시도를하고 teorethically 제외 문제를 구축 강화하는 일. 다음과 같이

CMakeLists.txt은 다음과 같습니다 사전에

. 
    . 
    . 
IF(WIN32) 
      # Flags para garantir a compilação em windows 
      SET(CMAKE_CXX_COMPILER icpl) 
      SET(TPN_WIN32 "/D WIN32") 
      SET(TPN_WIN32_LIB ws2_32.lib odbc32.lib odbccp32.lib) 
      SET(CMAKE_EXE_LINKER_FLAGS /NODEFAULTLIB:LIBC;LIBCMT) 

    ENDIF(WIN32) 

    # Comando para se livrar de warning sobre o caminho da library pthread 
    IF(COMMAND cmake_policy) 
     cmake_policy(SET CMP0003 NEW) 
    ENDIF(COMMAND cmake_policy) 

    # Configuracao do TPN REALTIME 
    # === inicio === 
    IF (REALTIME_YES) 
     MESSAGE ("[TPN] REALTIME ENABLED") 
     set(Boost_ADDITIONAL_VERSIONS "1.45.0") 
     set(Boost_USE_MULTITHREAD ON) 
     set(Boost_USE_STATIC_LIBS ON) 
     FIND_PACKAGE(Boost "1.45.0" COMPONENTS system filesystem serialization program_options regex thread date_time REQUIRED) 
     FIND_PACKAGE(Threads REQUIRED) 

     set(HYDRO_CXX_FLAGS "-DREALTIME -DJOYSTICK") 
     set(HYDRO_CXX_LFLAGS ${Boost_LIBRARIES}) 

     INCLUDE_DIRECTORIES(hydro) 


     INCLUDE_DIRECTORIES(${Boost_INCLUDE_DIR}) 
     ENDIF (REALTIME_YES) 
     # === final === 
     . 
     . 
     . 

    TARGET_LINK_LIBRARIES(Dyna 
     tpn 
     preadyn 
     ${WHERE_PREA3D} 
     ${WHERE_WAMIT_IO} 
     ${WHERE_WAMIT_CONVERTER} 
     ${WHERE_TECLINE} 
     ${HYDRO_CXX_LFLAGS} 
     ${TPN_WIN32_LIB} 
    ) 

감사 (이익의 일부를 분리)

답변

18

시도해야하는 것이 될 수있다. MSVC에서 예외가 발생하지 않고 vcproj에서 활성화해야합니다.

+0

그게 문제를 해결했습니다. 많은 많은 감사 ... – Ishida

+5

MSVS IDE를 사용하는 경우이 또한 필요합니다. 프로젝트 -> 등록 정보 -> C/C++ -> 코드 생성 -> C++ 예외 활성화 : 예 – EhevuTov

2

boost.systemboost.regex

링크는 (기본적으로)가 필요합니다 창에서 실행하는 경우

그것은 here 말하기를 :

Note With MSVC or Borland C++ you may want to add -DBOOST_DATE_TIME_NO_LIB and -DBOOST_REGEX_NO_LIB to your project settings to disable autolinking of the Boost.Date_Time and Boost.Regex libraries respectively. Alternatively, you may choose to build these libraries and link to them.

다른 부스트 라이브러리에 연결하지 않으려면 here에서 동일한 (비 부스트) asio 라이브러리를 사용할 수 있습니다. 당신의 CMakeLists.txt 파일의 측면에서

, 당신은

target_link_libraries (your_application ${Boost_LIBRARIES}) 

라이브러리를 실제로 연결하는 등 라인을합니다.

편집 : 또한, How to link against boost.system with cmake에서 봐, 당신이 cmake에 TPN_WIN32 변수에 플래그 "/ EHsc"를 추가하는 개별 부스트 라이브러리를 지정 특히보다는 ${Boost_LIBRARIES}

5

필자의 경우 /EHsc 플래그가 작동하지 않습니다. 컴파일러가 boost/throw_exception.hpp처럼 "사용자 정의"를 검색 할 수 있도록 BOOST_NO_EXCEPTIONS이 정의되어 있다는 것이 드러났습니다.

따라서, 빠른 수정이 좋아하는 boost::throw_exception() 기능을 작성하는 것입니다 :

namespace boost 
{ 
#ifdef BOOST_NO_EXCEPTIONS 
void throw_exception(std::exception const & e){ 
    throw 11; // or whatever 
}; 
#endif 
}// namespace boost 
1

호환 연결하는, 같은데을, 이진은 동일한 구조 예외 처리 인 에이블먼트 옵션이 있어야합니다. MSVC 표준 라이브러리 구현은 구조화 된 예외 처리 옵션을 사용합니다. boost :: system 또한 이것을 사용하는 이유입니다. 구조 예외 처리를 추가하라는 해당 경고가 표시 될 수 있습니다.

IF(MSVC) 
    ADD_DEFINITIONS("/EHsc") 
ENDIF(MSVC) 
관련 문제