Cmake को बूस्ट नहीं मिलता है


86

मैं CMake का उपयोग कर एक परियोजना को कॉन्फ़िगर करने की कोशिश कर रहा हूं, लेकिन यह निर्दिष्ट फ़ोल्डर में होते हुए भी बूस्ट लाइब्रेरी को खोजने में विफल रहता है। मैंने निर्दिष्ट किया है Boost_INCLUDE_DIR, Boost_LIBRARYDIRऔर BOOST_ROOT, लेकिन मुझे अभी भी एक त्रुटि मिली है जिसमें कहा गया है कि सीएमके बूस्ट को खोजने में सक्षम नहीं है। ऐसी त्रुटि का कारण क्या हो सकता है?


बूस्ट के कुछ संस्करण ध्वज का उपयोग करते हैं Boost_INCLUDE_DIRऔर अन्य ध्वज का उपयोग करते हैं Boost_INCLUDEDIR( अंडरस्कोर के बिना )। आप FindBoost.cmakeफ़ाइल को पढ़कर अपने मामले के लिए सही एक की जाँच कर सकते हैंpath-to-cmake/Modules/FindBoost.cmake
marcelosalloum

FYI करें, यदि आप CMake समर्थन के साथ बढ़ावा दे रहे हैं तो आपको उपयोग करना चाहिएfind_package(Boost CONFIG)
दिमित्री सोजोनोव

जवाबों:


105

क्या आप वाकई इसे सही तरीके से कर रहे हैं? विचार यह है कि CMake सेट करता है BOOST_INCLUDE_DIR, BOOST_LIBRARYDIRऔर BOOST_ROOTस्वचालित रूप से। कुछ इस तरह से करें CMakeLists.txt:

FIND_PACKAGE(Boost)
IF (Boost_FOUND)
    INCLUDE_DIRECTORIES(${Boost_INCLUDE_DIR})
    ADD_DEFINITIONS( "-DHAS_BOOST" )
ENDIF()

यदि किसी डिफ़ॉल्ट स्थान पर बूस्ट स्थापित नहीं है और इस प्रकार, सीएमके द्वारा नहीं पाया जा सकता है, तो आप सीएमके को बता सकते हैं कि इसे बढ़ावा देने के लिए कहां देखना है:

SET(CMAKE_INCLUDE_PATH ${CMAKE_INCLUDE_PATH} "C:/win32libs/boost")
SET(CMAKE_LIBRARY_PATH ${CMAKE_LIBRARY_PATH} "C:/win32libs/boost/lib")

बेशक, उन दो पंक्तियों होना है इससे पहले किFIND_PACKAGE(Boost) में CMakeLists.txt


36
यह ${Boost_INCLUDE_DIR}नहीं है ${BOOST_INCLUDE_DIR}, मामला मायने रखता है।
इहार कहारलिचेंको

3
शायद यह cmake के नए संस्करणों में बदल गया है, लेकिन यहाँ संदर्भ डॉक्स हैं: cmake.org/cmake/help/v3.0/module/FindBoost.html
Nick Desaulniers

2
यह मेरे लिए काम नहीं करता ... यह बूस्ट लाइब्रेरी को ढूंढता है, लेकिन संकलन के समय त्रुटियों के टन पैदा करता है

1
क्या यह ' BOOST_INCLUDEDIR' नहीं होना चाहिए ?
13

2
@IhorKaharlichenko, लेकिन BOOST_ROOT BOOST_ROOT होना चाहिए। आश्चर्यजनक ! मुझे सभी मामलों, ऊंट के मामले, सभी टोपी, अंडरस्कोर के साथ, बिना अंडरस्कोर के ... <चेहरे की हथेली>
डक डॉजर्स

53

FindBoost.cmakeफ़ाइल को पढ़ने से ही अधिक मदद मिलती है। यह आपके 'मॉड्यूल' डायरेक्टरी में स्थित है।

एक अच्छी शुरुआत है set(Boost_DEBUG 1)- यह इस बारे में जानकारी का एक अच्छा सौदा थूक देगा जहां बढ़ावा दिख रहा है, यह क्या देख रहा है, और यह समझाने में मदद कर सकता है कि यह क्यों नहीं मिल सकता है।

यह भी पता लगाने में मदद कर सकता है कि यह आपके BOOST_ROOTठीक से उठा रहा है या नहीं।

FindBoost.cmakeकभी-कभी समस्याएँ भी होती हैं, अगर उपलब्ध संस्करण का सटीक संस्करण उपलब्ध संस्करणों में सूचीबद्ध नहीं होता है। इसके बारे में आप पढ़कर और जान सकते हैं FindBoost.cmake

अन्त FindBoost.cmakeमें, अतीत में कुछ कीड़े पड़ चुके हैं। आपके द्वारा कोशिश की जाने वाली एक चीज FindBoost.cmakeसीएमके के नवीनतम संस्करण से एक नया संस्करण लेना है , और इसे अपने प्रोजेक्ट फ़ोल्डर में चिपका दें CMakeLists.txt- फिर भले ही आपके पास बूस्ट का पुराना संस्करण हो, यह उस के नए संस्करण का उपयोग करेगा FindBoost.cmake। आपकी परियोजना का फ़ोल्डर।

सौभाग्य।


10

मैं खुद कुछ समय तक इस समस्या से जूझता रहा। यह पता चला है कि cmakeबूस्ट के नामकरण सम्मेलन का उपयोग करके बूस्ट लाइब्रेरी फ़ाइलों की तलाश थी, जिसमें लाइब्रेरी का नाम इसे बनाने के लिए उपयोग किए जाने वाले कंपाइलर संस्करण का एक फ़ंक्शन है। हमारे बूस्ट लाइब्रेरी का उपयोग करके बनाया गया था GCC 4.9.1, और यह संकलक संस्करण वास्तव में हमारे सिस्टम पर मौजूद था; हालाँकि, GCC 4.4.7स्थापित करने के लिए भी हुआ। जैसा कि होता है, cmake की FindBoost.cmakeस्क्रिप्ट एक के GCC 4.4.7बजाय इंस्टॉलेशन का स्वत: पता लगा रही GCC 4.9.1थी, और इस प्रकार " gcc44" के बजाय फ़ाइल नामों में " " के साथ बूस्ट लाइब्रेरी फाइलों की तलाश थी gcc49

उन्हें आसानी से ठीक माना कि जीसीसी 4.9 मौजूद था, की स्थापना द्वारा बल cmake के लिए गया था Boost_COMPILER"करने के लिए -gcc49में" CMakeLists.txt। इस बदलाव के साथ FindBoost.cmake, मेरी बूस्ट लाइब्रेरी फाइलों को ढूंढा और पाया गया।


6

आप बूस्ट के उस संस्करण को भी निर्दिष्ट कर सकते हैं जिसे आप सीएमके पसंद करेंगे जिसका उपयोग सही संस्करण बूस्टर हेडर के स्थान पर जाकर -DBOOST_INCLUDEDIRया -DBOOST_ROOTइंगित करके किया जाएगा।

उदाहरण:

cmake -DBOOST_ROOT=/opt/latestboost

यह भी उपयोगी होगा जब एक ही सिस्टम पर कई बूस्ट वर्जन होंगे।


धन्यवाद, कि मेरे लिए विंडोज के लिए एवरो बिल्ड के साथ काम किया।
गुगिरोव

5

मुझे भी इसी तरह की समस्या थी और पता चला कि BOOST_INCLUDE_DIR, BOOST_LIBRARYDIR और BOOST_ROOT env वैरिएबल को पूर्ण पथ रखना चाहिए । HTH!


हाँ। BOOST_ROOT env में सापेक्ष पथ के कारण समान समस्या थी। आपको बहुत बहुत धन्यवाद!
korst1k

2

makeउबंटू ट्रस्टी 64 पर बूस्ट संस्करण 1.66.0 स्थापित करने के बाद एक परियोजना के लिए चलाने की कोशिश करते समय मुझे यही समस्या थी । त्रुटि संदेश इसी के समान था (बिल्कुल नहीं जैसा):

CMake Error at     
/usr/local/Cellar/cmake/3.3.2/share/cmake/Modules/FindBoost.cmake:1245 (message):
Unable to find the requested Boost libraries.
Boost version: 0.0.0
Boost include path: /usr/include
Detected version of Boost is too old.  Requested version was 1.36 (or newer).
Call Stack (most recent call first):
CMakeLists.txt:10 (FIND_PACKAGE)

बूस्ट निश्चित रूप से स्थापित किया गया था, लेकिन सीएमके इसका पता नहीं लगा सके। पथ और पर्यावरण चर के साथ बहुत समय बिताने के बाद, मैंने अंततः cmakeविकल्पों के लिए खुद को जांचना समाप्त कर दिया और निम्नलिखित पाया:

--check-system-vars        = Find problems with variable usage in system files

इसलिए मैं मुद्दे पर निर्देशिका में निम्नलिखित भाग गया:

sudo cmake --check-system-vars

जो लौटा:

Also check system files when warning about unused and uninitialized variables.
-- Boost version: 1.66.0
-- Found the following Boost libraries:
--   system
--   filesystem
--   thread
--   date_time
--   chrono
--   regex
--   serialization
--   program_options
-- Found Git: /usr/bin/git
-- Configuring done
-- Generating done
-- Build files have been written to: /home/user/myproject

और इस मुद्दे को हल किया।


2

निर्दिष्ट 3.1.0-rc2करने के लिए cmake संस्करण के लिएboost 1.57-D_boost_TEST_VERSIONS=1.57

cmake version 3.1.0-rc2चूक का boost<=1.56.0उपयोग करते हुए देखा जाता है-DBoost_DEBUG=ON

cmake -D_boost_TEST_VERSIONS=1.57 -DBoost_DEBUG=ON -DCMAKE_BUILD_TYPE=Debug -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++


2

यदि आप अपना स्वयं का निर्माण कर रहे हैं, तो उपयोग करना न भूलें --layout=versionedअन्यथा लाइब्रेरी के किसी विशेष संस्करण की खोज विफल हो जाएगी


1

विशेष रूप से सीजीएएल बनाने की कोशिश कर रहे किसी के लिए एक और सलाह , सांख्यिकीय रूप से जुड़े बूस्ट के साथ। यह परिभाषित करने के लिए पर्याप्त नहीं है Boost_USE_STATIC_LIBS; यह उस समय तक ओवरराइड हो जाता है जब तक Boost_DEBUGइसका मूल्य नहीं निकलता। यहां करने वाली बात यह है कि "उन्नत" चेकबॉक्स की जांच करें और सक्षम करें CGAL_Boost_USE_STATIC_LIBS


0

मुझे वही समस्या थी, और उपरोक्त समाधानों में से किसी ने भी काम नहीं किया। दरअसल, फाइल include/boost/version.hppको पढ़ा नहीं जा सकता था (जेनकींस द्वारा शुरू की गई सेमीक स्क्रिप्ट द्वारा)।

मुझे (बूस्ट) लाइब्रेरी की अनुमति को मैन्युअल रूप से बदलना पड़ा (भले ही जेनकिंस समूह से संबंधित है, लेकिन यह जेनकिंस से जुड़ी एक और समस्या है जिसका मैं पता नहीं लगा सकता):

chmod o+wx ${BOOST_ROOT} -R # allow reading/execution on the whole library
#chmod g+wx ${BOOST_ROOT} -R # this did not suffice, strangely, but it is another story I guess

0

यह तब भी हो सकता CMAKE_FIND_ROOT_PATHहै जब इससे अलग किया जाता है BOOST_ROOT। मुझे एक ही समस्या का सामना करना पड़ा कि सेटिंग के बावजूद BOOST_ROOT, मुझे त्रुटि मिल रही थी। लेकिन एआरएम के लिए क्रॉस कंपाइलिंग के लिए मैं टूलचेन-एंड्रॉइड का उपयोग कर रहा था। सेमीकेक जिसमें मेरे पास (किसी कारण से) था:

set(BOOST_ROOT "/home/.../boost")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} --sysroot=${SYSROOT}")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} --sysroot=${SYSROOT} -I${SYSROOT}/include/libcxx")
set(CMAKE_CXX_LINK_FLAGS "${CMAKE_CXX_LINK_FLAGS}")
set(CMAKE_FIND_ROOT_PATH "${SYSROOT}")

CMAKE_FIND_ROOT_PATHऐसा लगता है कि BOOST_ROOTइस मुद्दे को जन्म दे रहा था।


-1

शायद

brew install boost

आपकी सहायता करेगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.