2011-07-26 10 views
7

के साथ उत्पन्न समाधान मैं सीएमके और बूस्ट लाइब्रेरी का उपयोग करके जीसीसी (लिनक्स) से एमएसवीसी (विंडोज़) तक एक बड़ी परियोजना को बंद करने की कोशिश कर रहा हूं।एलएनके2019 जब एएसआई हेडर समेत, सेमेक

परियोजना संकलन और जीसीसी के लिए ठीक चलता है, लेकिन यह निम्न त्रुटि देता है 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

कोशिश cmake में अपने TPN_WIN32 चर में झंडा "/ EHsc" जोड़ने के लिए अलग-अलग बढ़ावा पुस्तकालयों निर्दिष्ट करने के लिए है। ऐसा लगता है कि एमएसवीसी अपवाद फेंक नहीं रहा है और आपको इसे अपने वीसीप्रोज़ में सक्षम करने की आवश्यकता है।

+0

इससे समस्या हल हो गई। बहुत से धन्यवाद ... – Ishida

+5

यदि आप एमएसवीएस आईडीई का भी उपयोग कर रहे हैं तो यह भी जरूरी है। परियोजना-> गुण-> सी/सी ++ -> कोड जनरेशन-> सी ++ अपवाद सक्षम करें: हां – EhevuTov

2

जब boost.system और boost.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 से समान (गैर-बूस्ट) एएसओ लाइब्रेरी का उपयोग कर सकते हैं।

अपने CMakeLists.txt फ़ाइल के संदर्भ में, आप

target_link_libraries (your_application ${Boost_LIBRARIES}) 

वास्तव में पुस्तकालय लिंक करने के लिए इस तरह के रूप में एक लाइन चाहते हैं।

संपादित करें: भी, How to link against boost.system with cmake पर एक नजर है, यह हो सकता है आप विशेष रूप से करने के बजाय ${Boost_LIBRARIES}

5

मेरे मामले में, /EHsc ध्वज काम नहीं किया। यह पता चला कि BOOST_NO_EXCEPTIONS परिभाषित किया गया था ताकि संकलक "उपयोगकर्ता परिभाषित" (बूस्ट/throw_exception.hpp में) फ़ंक्शन के लिए खोज कर रहा था।

इसलिए, त्वरित सुधार अपने पसंदीदा boost::throw_exception() समारोह लिखने के लिए है:

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

, ऐसा लगता है कि संगत को जोड़ने जा करने के लिए, द्विआधारी उसी संरचना अपवाद हैंडलिंग सक्षम बनाने का विकल्प होना चाहिए। एमएसवीसी मानक पुस्तकालय कार्यान्वयन पर संरचित अपवाद हैंडलिंग विकल्प का उपयोग करें। ऐसा लगता है कि बूस्ट :: सिस्टम भी इसका उपयोग करता है। आपको संरचना चेतावनी हैंडलिंग जोड़ने के लिए आपको बताए गए संबंधित चेतावनियां दिखाई दे सकती हैं।

IF(MSVC) 
    ADD_DEFINITIONS("/EHsc") 
ENDIF(MSVC) 
संबंधित मुद्दे