C ++ Boost: बढ़ावा देने के लिए अपरिभाषित संदर्भ :: सिस्टम :: generic_category ()


92

मैं Boostअपने प्रोजेक्ट में पुस्तकालयों को शामिल करने की कोशिश कर रहा हूं और उसी में मुद्दों का सामना कर रहा हूं। मैं कोडब्लॉक्स आईडीई के साथ उबंटू 12.10 पर हूं और साइट से निर्देशों को मैन्युअल रूप से पढ़ने के लिए पुस्तकालयों को स्थापित करने की कोशिश की, लेकिन हेडर के साथ-साथ-साथ-पहले-उपयोग किए जाने वाले पुस्तकालयों में त्रुटि हो रही थी।

मैंने तब टर्मिनल के माध्यम से पुस्तकालयों को स्थापित किया sudo apt-get install libboost-all-dev। इसके बाद, कोडब्लॉक पर अपने कार्यक्रमों में, मैं हेडर को शामिल कर सकता हूं, #include <boost/regex.hpp>लेकिन जब मैं फाइलसिस्टम लाइब्रेरी के हेडर को शामिल करने की कोशिश करता हूं ( #include "boost/filesystem/operations.hpp" ), तो मुझे निम्न त्रुटि मिल रही है:

/usr/include/boost/system/error_code.hpp|214|undefined reference to boost::system::generic_category()'|

मुझे यकीन नहीं है कि इस त्रुटि को कैसे हल किया जाए (विशेष रूप से लिनक्स पर कोडब्लॉक में)। मैं वास्तव में यहाँ कुछ मदद का उपयोग कर सकता हूं।

कंपाइलर: Gcc
प्रोग्राम कोड: उपरोक्त फ़ाइल सिस्टम operations.hppफ़ाइल को केवल inlcuding करने की कोशिश की ।

कोडब्लॉक से लॉग बनाएँ:

Build started on: 20-11-2012 at 18:02.53
Build ended on: 20-11-2012 at 18:02.54
-------------- Build: Debug in libopenFrameworks ---------------
Target is up to date.
-------------- Build: Debug in reader1 ---------------
make -s -f Makefile Debug
linking i686 bin/reader1_debug linux
obj/i686Debug/src/testApp.o: In function `__static_initialization_and_destruction_0':
/usr/include/boost/system/error_code.hpp:214: undefined reference to `boost::system::generic_category()'
/usr/include/boost/system/error_code.hpp:215: undefined reference to `boost::system::generic_category()'
/usr/include/boost/system/error_code.hpp:216: undefined reference to `boost::system::system_category()'
obj/i686Debug/src/main.o: In function `__static_initialization_and_destruction_0':
/usr/include/boost/system/error_code.hpp:214: undefined reference to `boost::system::generic_category()'
/usr/include/boost/system/error_code.hpp:215: undefined reference to `boost::system::generic_category()'
/usr/include/boost/system/error_code.hpp:216: undefined reference to `boost::system::system_category()'
collect2: ld returned 1 exit status
make: *** [bin/reader1_debug] Error 1
Process terminated with status 2 (0 minutes, 1 seconds)
6 errors, 0 warnings

आपका इसे सही लिंक नहीं कर रहा है,
कोडब्लॉक

@pyCthon: उस स्थिति में, क्या आप इसे कोड :: ब्लॉक में लिंक करने के बारे में अधिक विवरण जोड़ सकते हैं। मैंने -lboost_systemसेटिंग्स में किसी स्थान पर लिंकर ध्वज जोड़ने की कोशिश की , लेकिन यह हल नहीं हुआ। हालाँकि, मुझे पूरा यकीन नहीं है कि मैंने सही जगह पर पूरी तरह से लिंकर ध्वज का काम किया है। थोड़ा और विस्तार से बहुत मदद मिलेगी।
सिफर

क्या आप संकलक का उपयोग कर रहे हैं? MinGW? जीसीसी? आप किस कोड को चलाने की कोशिश कर रहे हैं? एक उदाहरण दे .....
pyCthon

@pyCthon: कॉमलर Gcc है। मैंने अब तक कोई कोड नहीं लिखा है, लेकिन Boost filesystem library(ऊपर की पोस्ट में ऑपरेशन) को शामिल करने की कोशिश की है
सिफर

यह कमांड लाइन से जी + के साथ फाइलसिस्टम लाइब्रेरी को बढ़ावा देने के लिए एक नियमित कार्यक्रम को संकलित करने का काम करता है?
pyCthon

जवाबों:


141

आपको libboost_systemलाइब्रेरी में लिंक करना चाहिए । मुझे कोडब्लॉक के बारे में निश्चित नहीं है, लेकिन आपके प्लेटफॉर्म पर g ++ कमांड-लाइन विकल्प होगा

-lboost_system


मुझे पहले से ही लिंकर फ़्लैग मिल गया है। इसे कोडब्लॉक में काम नहीं कर सकते।
सिफर

@ क्या आप कोडब्लॉक द्वारा निष्पादित बिल्ड और लिंक कमांड प्राप्त कर सकते हैं?
जुआनकोपंजा

@ सिफर क्षमा करें, पास्टबिन काम पर अवरुद्ध है। मैं बाद में जांच कर सकता हूं लेकिन इसमें कुछ घंटे लगेंगे।
जुआनकोपंजा

कोई दिक्कत नहीं है। साथ ही पोस्ट में अपडेट किया गया
सिफर

मैं सिफर के रूप में एक ही समस्या है, बस मेरे मामले में मैं बढ़ावा / asio.hpp के साथ सौदा। कंपाइलर की कोशिश करने पर मुझे ये त्रुटि s1.directupload.net/images/130608/koyvqpdp.jpg मिलती है । जब मैं -lboost_system को जोड़ने का प्रयास करता हूं तो यह कहता है कि "lboost_system नहीं ढूँढ सकता"। समस्या क्या है?
ddacot

21

बूस्ट वर्जन के आधार पर लिबस्टोस्ट-सिस्टम एमटी प्रत्यय के साथ आता है जो पुस्तकालयों को मल्टीथ्रेडिंग क्षमता का संकेत देना चाहिए।

तो अगर -lboost_systemलिंकर की कोशिश से नहीं पाया जा सकता है -lboost_system-mt


1
यह काम करता है क्योंकि इन बढ़ावा संस्करणों के लिए वास्तविक पुस्तकालय फ़ाइल नाम में एक -mtप्रत्यय था।
tssch

9

यह एक लिंकर समस्या है। अपनी परियोजना में स्थिर पुस्तकालय पथ शामिल करें।

Qt क्रिएटर के लिए प्रोजेक्ट फ़ाइल खोलें .proऔर निम्न पंक्ति जोड़ें:

LIBS += -L<path for boost libraries in the system> -lboost_system

मेरे मामले में Ubuntu x86_64:

LIBS += -L/usr/lib/x86_64-linux-gnu -lboost_system

कोडब्लॉक के लिए, Settings->Compiler...->Linkerसेटिंग टैब खोलें और जोड़ें:

boost_system

लिंक पुस्तकालयों पाठ विजेट और प्रेस OKबटन के लिए।


7

मैंने एक हल के रूप में अच्छी तरह से खोज की, और मेरे द्वारा उत्तर दिए गए किसी भी उत्तर ने त्रुटि को हल नहीं किया, जब तक कि मुझे इस धागे के लिए "ViRuSTriNiTy" का उत्तर नहीं मिला: '' :: बढ़ावा :: प्रणाली :: generic_category () '' का अपरिभाषित संदर्भ?

उस उत्तर के अनुसार, इन पंक्तियों को अपनी cmake फ़ाइल में जोड़ने का प्रयास करें:

find_package(Boost 1.55.0 REQUIRED COMPONENTS system filesystem)
include_directories(... ${Boost_INCLUDE_DIRS})
link_directories(... ${Boost_LIBRARY_DIRS})
target_link_libraries(... ${Boost_LIBRARIES})

5

बूस्ट और सेमीके का उपयोग करते समय इस उत्तर ने वास्तव में मदद की।

add_definitions(-DBOOST_ERROR_CODE_HEADER_ONLY)Cmake फ़ाइल के लिए जोड़ना ।

मेरा CMakeLists.txt इस तरह दिखता है:

cmake_minimum_required(VERSION 3.12)
project(proj)

set(CMAKE_CXX_STANDARD 17)


set(SHARED_DIR "${CMAKE_SOURCE_DIR}/../shared")

set(BOOST_LATEST_DIR            "${SHARED_DIR}/boost_1_68_0")
set(BOOST_LATEST_BIN_DIR        "${BOOST_LATEST_DIR}/stage/lib")
set(BOOST_LATEST_INCLUDE_DIR    "${BOOST_LATEST_DIR}/boost")
set(BOOST_SYSTEM                "${BOOST_LATEST_BIN_DIR}/libboost_system.so")
set(BOOST_FS                    "${BOOST_LATEST_BIN_DIR}/libboost_filesystem.so")
set(BOOST_THREAD                "${BOOST_LATEST_BIN_DIR}/libboost_thread.so")

set(HYRISE_SQL_PARSER_DIR           "${SHARED_DIR}/hyrise_sql_parser")
set(HYRISE_SQL_PARSER_BIN_DIR       "${HYRISE_SQL_PARSER_DIR}")
set(HYRISE_SQL_PARSER_INCLUDE_DIR   "${HYRISE_SQL_PARSER_DIR}/src")
set(HYRISE_SQLPARSER                "${HYRISE_SQL_PARSER_BIN_DIR}/libsqlparser.so")


include_directories(${CMAKE_SOURCE_DIR} ${BOOST_LATEST_INCLUDE_DIR} ${HYRISE_SQL_PARSER_INCLUDE_DIR})

set(BOOST_LIBRARYDIR "/usr/lib/x86_64-linux-gnu/")
set(Boost_USE_STATIC_LIBS OFF)
set(Boost_USE_MULTITHREADED ON)
set(Boost_USE_STATIC_RUNTIME OFF)

add_definitions(-DBOOST_ERROR_CODE_HEADER_ONLY)

find_package(Boost 1.68.0 REQUIRED COMPONENTS system thread filesystem)

add_executable(proj main.cpp row/row.cpp row/row.h table/table.cpp table/table.h page/page.cpp page/page.h
        processor/processor.cpp processor/processor.h engine_instance.cpp engine_instance.h utils.h
        meta_command.h terminal/terminal.cpp terminal/terminal.h)


if(Boost_FOUND)
    include_directories(${Boost_INCLUDE_DIRS})
    target_link_libraries(proj PUBLIC Boost::system Boost::filesystem Boost::thread ${HYRISE_SQLPARSER})
endif()

4

एक साधारण बूस्ट उदाहरण के निर्माण पर समान समस्या, हल होने के बाद मैंने g ++ कंपाइलर ध्वज को -dd = c ++ 14 से -std = c ++ 11 में बदल दिया

और मैंने देखा कि यह एक C ++ 11 उदाहरण है ...


इससे मेरी समस्या हल हो गई। संकलन के दौरान इस्तेमाल किए गए झंडे को भूलना काफी आसान है, खासकर जब आप डिफ़ॉल्ट का उपयोग करते हैं।
फ़िलिप कैलसन्स

3

मुझे भी यही समस्या थी और लिनक्स मिंट (nuduoz के रूप में) का उपयोग करें। मैं अपने मामले समस्या के बाद मैं जोड़ा हल किया गया था boost_systemकरने के लिए GCC C++ Linker->Libraries


1

आप एक और समस्या के पार आ सकते हैं। लिनक्स मिंट पर बूस्ट स्थापित करने के बाद मुझे वही समस्या हुई है। लायब्रेरी में नाम होने के कारण लिंक करना -lboost_systemया -lboost_system-mtकाम नहीं किया है libboost_system.so.1.54.0

तो समाधान मूल फ़ाइल का प्रतीकात्मक लिंक बनाना है। मेरे मामले में

sudo ln -s /usr/lib/x86_64-linux-gnu/libboost_system.so.1.54.0 /usr/lib/libboost_system.so

अधिक जानकारी के लिए यह प्रश्न देखें ।


1

पुस्तकालय पुस्तकालय स्थापित नहीं है आप को बढ़ावा देने के पुस्तकालयों फ़ोल्डर देना चाहिए:

उदाहरण:

g ++ -L / usr / lib / x86_64-linux-gnu -lboost_system -lboost_filesystem prog.cpp -o prog


0

प्रयत्न

g++ -c main.cpp && g++ main.o /usr/lib/x86_64-linux-gnu/libboost_system.so && ./a.out 

/usr/lib/x86_64-linux-gnu/ बूस्ट लाइब्रेरी का स्थान है

find /usr/ -name '*boost*.so'बढ़ावा पुस्तकालय स्थान खोजने के लिए उपयोग करें


0

g ++ -lboost_system -lboost_filesystem userentry.cpp -o userentry

डेबियन के तहत पूरी तरह से काम किया। (apt-get के साथ स्थापित c ++ पुस्तकालयों को बढ़ावा दें)।


0

ऊपर वर्णित प्रस्तावित समाधानों के परीक्षण के बाद, मैंने पाया कि इनमें से कुछ ही लाइनें काम करेंगी।

मैं Ubuntu 16.04 का उपयोग कर रहा हूं।

cmake_minimum_required (संस्करण 3.13)
परियोजना (myProject)

सेट (CMAKE_CXX_STANDARD 11)
add_executable (myProject main.cpp)

find_package (बूस्ट 1.58.0 आवश्यक घटक सिस्टम फाइल सिस्टम)
target_link_lbooks (myProject $ {Boost_LIBRARIES})

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