2011-11-10 17 views
14

मैं विंडोज़ पर एक बूस्ट आधारित एप्लिकेशन संकलित करने के लिए एक सेमेक स्क्रिप्ट का उपयोग करने की कोशिश कर रहा हूं। हेडर केवल पुस्तकालयों अच्छा काम है, लेकिन cmakes पुस्तकालयों (निम्नलिखित बूस्ट पुस्तकालयों पाया नहीं जा सका: boost_serialization) को खोजने में विफल cmake स्क्रिप्ट के प्रासंगिक हिस्सा है:सेमेक को बूस्ट लाइब्रेरी नहीं मिली

#path where cmake can find additional libraries 
SET(CMAKE_PREFIX_PATH Libs) 

#boost 
SET(Boost_ADDITIONAL_VERSIONS "1.47" "1.47.0") 
SET(Boost_USE_STATIC_LIBS ON) 
find_package(Boost REQUIRED COMPONENTS serialization) 

मैं एक फ़ोल्डर बुलाया " लिब्स "मेरे प्रोजेक्ट के अंदर जहां डेविल और बूस्ट जैसे तीसरे पक्ष के पुस्तकालय संग्रहीत किए जाते हैं, इसलिए मैंने इसे पहले सेट किया। शैतान के लिए ठीक काम करता है और हेडर-केवल सामान को बढ़ावा देता है, इसलिए मुझे लगता है कि मुझे BOOST_ROOT चर की आवश्यकता नहीं है। बूस्ट इंस्टॉलेशन boost.org से मानक स्रोत वितरण है जिसे मैंने bjam के साथ संकलित किया है। लाइब्रेरी boost_1_47_0 \ bin.v2 \ libs में संग्रहीत हैं, मैंने बिल्ड प्रक्रिया में कुछ भी नहीं बदला है। मुझे लगता है कि यह थोड़ा अजीब है, कि boost_1_47_0 \ libs फ़ोल्डर में कोई लाइब्रेरी फ़ाइलें नहीं हैं लेकिन bjam फ़ाइलें और अन्य सामान नहीं हैं, लेकिन यह कोई समस्या नहीं होनी चाहिए क्योंकि यह सीम विंडोज़ पर बढ़ावा देने का सामान्य तरीका है स्रोत से

मैंने FindBoost.cmake से डीबग आउटपुट देखा (मैं सीएमके 2.8 से डिफ़ॉल्ट स्क्रिप्ट का उपयोग कर रहा हूं) और यह bin.v2 में देखने के लिए सीम नहीं है। इसके बजाय यह boost_ROOT/lib की खोज करता है, लेकिन जब मैंने bin.v2 \ libs से lib को सामग्री कॉपी की है तो इसे अभी भी कुछ भी नहीं मिला है।

तो बूस्ट खोजने का एक शानदार तरीका क्या है, जो सामान्य बोस्ट वितरण के साथ अन्य प्लेटफॉर्म पर भी काम करेगा?

उत्तर

5

ठीक है, मैंने समस्या हल की, लेकिन मैं अपने समाधान से पूरी तरह से संतुष्ट नहीं हूं। मेरी राय में समस्या थी, कि bjam जटिल फ़ोल्डर संरचना के लिए एक बनाएँ। अब मैंने पुस्तकालय फ़ाइलों को "boost_1_47_0 \ bin.v2 \ libs \ serialization \ build \ msvc-9.0 \ debug \ link-static \ threading-multi" से "boost_1_47_0 \ lib" तक कॉपी किया है। मुझे इसे हाथ से करना है, लेकिन मैं उन कई बूस्ट पुस्तकालयों का उपयोग नहीं कर रहा हूं, इसलिए मेरी राय में यह कदम ठीक है। मैं अपने समाधान को सेमेक स्क्रिप्ट को अलग कर दूंगा, इसलिए अन्य उपयोगकर्ताओं को इसके साथ मिलना चाहिए।

+5

मैनुअल पढ़ें, मंच और स्थापित के बारे में जानें। – mloskot

+0

मैंने मैनुअल (http://www.boost.org/doc/libs/1_48_0/more/getting_started/windows.html) पढ़ा लेकिन विकल्प 5.2 का उपयोग किया। मुझे इसमें सभी पुस्तकालयों के साथ मंच निर्देशिका मिली और अब इसे मेरे बूस्ट लाइब्रेरी डीआईआर के रूप में सेट कर सकते हैं, लेकिन अगली बार मैं विकल्प 5.3 का प्रयास करूंगा। – JonathanK

+0

आप बूस्ट की अपनी स्थापना करने के लिए बस चरण और बूस्ट (हेडर) निर्देशिका की प्रतिलिपि बना सकते हैं। जैसे बूस्ट/-> सी: \ बूस्ट \ \ बूस्ट और स्टेज/* -> सी: \ boost \ lib – mloskot

13

मैं आपके CMakeLists.txt के अंदर BOOST_ROOT सेट करने का प्रयास करूंगा। मुझे पता है कि जब आप BOOST_ROOT सेट करते हैं तो यह मेरे लिए Boost_ADDITIONAL_VERSIONS चर सेट करते समय CMake 2.8.6 को 1.47.0 बढ़ा देगा।

यहाँ मैं 1 परियोजना में है:

 

    set(BOOST_COMPONENTS_NEEDED serialization) 

    # The following verifyies that BOOST_ROOT is set properly. 
    if(NOT BOOST_ROOT AND NOT $ENV{BOOST_ROOT} STREQUAL "") 
     FILE(TO_CMAKE_PATH $ENV{BOOST_ROOT} BOOST_ROOT) 
     if(NOT EXISTS ${BOOST_ROOT}) 
      MESSAGE(STATUS ${BOOST_ROOT} " does not exist. Checking if BOOST_ROOT was a quoted string..") 
      STRING(REPLACE "\"" "" BOOST_ROOT ${BOOST_ROOT}) 
      if(EXISTS ${BOOST_ROOT}) 
       MESSAGE(STATUS "After removing the quotes " ${BOOST_ROOT} " was now found by CMake") 
      endif(EXISTS ${BOOST_ROOT}) 
     endif(NOT EXISTS ${BOOST_ROOT}) 

    # Save the BOOST_ROOT in the cache 
     if(NOT EXISTS ${BOOST_ROOT}) 
      MESSAGE(WARNING ${BOOST_ROOT} " does not exist.") 
     else(NOT EXISTS ${BOOST_ROOT}) 
      SET (BOOST_ROOT ${BOOST_ROOT} CACHE STRING "Set the value of BOOST_ROOT to point to the root folder of your boost install." FORCE) 
      #SET (BOOST_INCLUDEDIR ${BOOST_ROOT}/Include) 
      #SET (BOOST_LIBRARYDIR ${BOOST_ROOT}/lib) 
     endif(NOT EXISTS ${BOOST_ROOT}) 

    endif(NOT BOOST_ROOT AND NOT $ENV{BOOST_ROOT} STREQUAL "") 

    if(WIN32 AND NOT BOOST_ROOT) 
     MESSAGE(WARNING "Please set the BOOST_ROOT environment variable.") 
    endif(WIN32 AND NOT BOOST_ROOT) 

    set(Boost_ADDITIONAL_VERSIONS "1.47" "1.47.0") 
    set(Boost_DEBUG ON) 
    set(Boost_USE_STATIC_LIBS  OFF) 
    set(Boost_USE_MULTITHREADED  ON) 
    set(Boost_USE_STATIC_RUNTIME OFF) 
    FIND_PACKAGE(Boost 1.47.0 COMPONENTS ${BOOST_COMPONENTS_NEEDED}) 
    if(Boost_FOUND) 
     MESSAGE(STATUS "Setting up boost.") 
     include_directories(${Boost_INCLUDE_DIRS}) 
     if(Boost_DEBUG) 
      MESSAGE(STATUS "BOOST Libraries " ${Boost_LIBRARIES}) 
      FOREACH(BOOST_COMPONENT ${BOOST_COMPONENTS_NEEDED}) 
       STRING(TOUPPER ${BOOST_COMPONENT} BOOST_COMPONENT_UPCASE) 
       MESSAGE(STATUS "Boost " ${BOOST_COMPONENT} ": " ${Boost_${BOOST_COMPONENT_UPCASE}_LIBRARY}) 
       MESSAGE(STATUS "Boost " ${BOOST_COMPONENT} " Debug: " ${Boost_${BOOST_COMPONENT_UPCASE}_LIBRARY_DEBUG}) 
       MESSAGE(STATUS "Boost " ${BOOST_COMPONENT} " Release: " ${Boost_${BOOST_COMPONENT_UPCASE}_LIBRARY_RELEASE}) 
      ENDFOREACH(BOOST_COMPONENT) 
     endif(Boost_DEBUG) 
    endif(Boost_FOUND) 

+1

यह इस स्क्रिप्ट के लिए धन्यवाद, मेरी बहुत मदद करता है। मैं Boost_FOUND के ठीक बाद एक लाइन चाहता हूं: LINK_DIRECTORIES ($ {Boost_LIBRARY_DIRS}) अन्यथा यह कहता रहता है कि लाइब्रेरी नहीं मिली थी। उम्मीद है कि यह दूसरों को एक ही समस्या होने में मदद करेगा। – Cross

+0

- बूस्ट बूस्ट संस्करण नहीं मिला: 1.60.0 बूस्ट में पथ शामिल है:/usr/ बूस्ट का पता लगाया गया संस्करण बहुत पुराना है। अनुरोधित संस्करण 1.64 (या नया) था। ..... ऊपर दिए गए टिप्पणी में जो भी उल्लेख किया गया है (विंडोज 10/CLion) –

1

मैंने पहले इस के साथ एक समस्या थी। किसी कारण से बी 2 (उर्फ बीजेएएम) ने अग्रणी "lib" के साथ बूस्ट लाइब्रेरी बनाई। Cmake स्क्रिप्ट libboost_thread.lib नाम की एक फ़ाइल की तलाश नहीं करेगा, यह केवल boost_thread.lib मिलेगा। अग्रणी lib हटाएं और सेमेक उन्हें ढूंढना चाहिए।

+0

मैंने कोशिश की लेकिन यह मदद नहीं की गई है अब नाम lib_osterization-vc90-mt-1_47.lib जैसे libboost_serialization की तरह है -vc90-mt-1_47.lib - और यदि मैं कुछ और पुस्तकालयों का उपयोग करना चाहता हूं तो मैं वास्तव में उन सभी का नाम बदलना नहीं चाहता ताकि cmake उन्हें ढूंढ सके। मेरी राय में, find_package मेरे लिए सभी काम करना चाहिए ... – JonathanK

+3

libs का नाम बदलें। डीएलएल के लिए उपसर्ग के बिना "lib" उपसर्ग स्थिर libs के लिए है। आपको रनटाइम-लिंक = इसके बजाए साझा करना चाहिए। –

+0

@AndreasHaferburg मेरे मामले में मैं विशेष रूप से अपने आवेदन में स्थिर लिंक बढ़ावा देने की कोशिश कर रहा था। –

0

आप cmake की कमांड लाइन के लिए निम्न विकल्प जोड़ सकते हैं स्थिर बढ़ावा पुस्तकालयों का उपयोग करने के लिए CGAL बताने के लिए:

-DCGAL_Boost_USE_STATIC_LIBS=true 
0

ने वही समस्या के साथ यहाँ आया और सिर्फ इतना कहना है मेरी ठीक जैसा ही, पर नहीं चाहता था बिल्कुल वैसा ही। मेरा इंस्टॉल उपसर्ग सी: \ lib \ boost \ boost_1_57_0 था। मैंने उस निर्देशिका में इंगित एक BOOST_ROOT पर्यावरण चर सेट किया है लेकिन सीएमके (3.1.0) अभी भी हेडर नहीं ढूंढ सका। मुझे एहसास हुआ कि हेडर को C: \ lib \ boost \ boost_1_57_0 \ \ boost-1_57 \ boost में शामिल करने के लिए डिफॉल्ट किया गया है। मैं एक से अधिक संस्करण को चलाने के लिए तो मैं बस नीचे एक अंतिम बढ़ावा निर्देशिका चले गए और बढ़ावा-1_57 निर्देशिका हटा दिया और हेडर के साथ यहां समाप्त हुए नहीं जा रहा हूँ:

C:\lib\boost\boost_1_57_0\include\boost 

और CMake सब कुछ मिल गया।

संबंधित मुद्दे