2011-07-26 6 views
7

Próbuję przenieść duży projekt z gcc (Linux) do msvc (windows), używając bibliotek cmake i boost.LNK2019 przy włączaniu nagłówków asio, rozwiązanie generowane przy użyciu cmake

kompilacji projektu i działa dobrze dla gcc ale na msvc zwraca następujący błąd:

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) 

Próbowałem uruchomiony prosty projekt przy użyciu doładowania ASIO i to działało, który teorethically wyklucza zwiększenia budować problemy.

CMakeLists.txt jest następujący: (oddzielone części odsetek)

. 
    . 
    . 
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} 
    ) 

góry dziękuję

Odpowiedz

18

Spróbuj dodać flagę „/ EHsc” do zmiennej TPN_WIN32 w cmake. Wygląda na to, że MSVC nie rzuca wyjątków i musisz je włączyć w swoim vcproj.

+0

To rozwiązało problem. wiele bardzo dziękuję ... – Ishida

+5

Jest to również potrzebne, jeśli korzystasz również z IDE MSVS. Projekt-> Właściwości-> C/C++ -> Generowanie kodu-> Włącz C++ Wyjątki: Tak – EhevuTov

2

Gdy w systemie Windows trzeba (domyślnie) link do boost.system i boost.regex

Jak mówi 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.

Jeśli nie chcesz łączyć z innymi bibliotekami boost, możesz użyć identycznej biblioteki Asio (bez wzmocnienia) z here.

chodzi o pliku CMakeLists.txt, chcesz linię takich jak

target_link_libraries (your_application ${Boost_LIBRARIES}) 

faktycznie odwołuje się do biblioteki.

EDIT: również spojrzeć na How to link against boost.system with cmake, mogłoby się okazać, że trzeba określić poszczególne biblioteki Boost specjalnie zamiast ${Boost_LIBRARIES}

5

W moim przypadku flaga /EHsc nie działa. Okazało się, że zdefiniowano BOOST_NO_EXCEPTIONS, więc kompilator szukał "zdefiniowanej przez użytkownika" (jak w funkcji boost/throw_exception.hpp).

Dlatego szybkie ustalenie jest napisać swój ulubiony boost::throw_exception() funkcję:

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

wygląda, być powiązanie kompatybilny binarnie musi mieć możliwość obsługi wyjątków włączającej obsługę samą strukturę. Implementacja biblioteki standardowej MSVC korzysta ze strukturalnej obsługi wyjątków. Wygląda na to, dlatego system boost :: również używa tego. Możesz zobaczyć odpowiednie ostrzeżenia nakazujące dodanie obsługi wyjątków struktury.

IF(MSVC) 
    ADD_DEFINITIONS("/EHsc") 
ENDIF(MSVC)