संकलन करने के लिए अपरिभाषित संदर्भ :: सिस्टम :: system_category ()


105

मैं Ubuntu 11.10 पर एक कार्यक्रम को संकलित करने की कोशिश कर रहा हूं जो बूस्ट लाइब्रेरी का उपयोग करता है। मेरे पास उबंटू रिपोजिटरी से 1.46-देवता बूस्ट लाइब्रेरी स्थापित है, लेकिन मुझे प्रोग्राम को संकलित करते समय एक त्रुटि मिलती है।

undefined reference to boost::system::system_category()

ऐसा क्या है कि मैं गलत करता हूं?


6
यह संकलक त्रुटि नहीं है, यह लिंकर त्रुटि है। आपको Boost.System लाइब्रेरी से लिंक करना होगा।
०१५:१

जवाबों:


160

आप जिस बूस्ट लाइब्रेरी का उपयोग कर रहे हैं, वह boost_system लाइब्रेरी पर निर्भर करती है। (उनमें से सभी नहीं करते हैं।)

मान लें कि आप gcc का उपयोग करते हैं, तो -lboost_systemउस लाइब्रेरी के विरुद्ध लिंक करने के लिए अपने कंपाइलर कमांड लाइन को जोड़ने का प्रयास करें।


3
मैं संकलन के लिए g ++ मेकफाइल का उपयोग कर रहा हूं। आमतौर पर कोई ऐसे झंडे कहां लगाता है?
user1049697

2
कंपाइलर / लिंकर कमांड लाइन को कैसे इकट्ठा किया जाता है यह केस से केस में बहुत भिन्न होता है। आप अपने प्रश्न में अपना मेकफाइल (या इसके संबंधित भागों) को क्यों नहीं चिपकाते हैं? इस तरह, आपको एक जवाब मिल सकता है जो आपके विशिष्ट मामले में काम करता है।
hc_

7
ठीक है, मैंने Makefile.am को संपादित किया और जोड़ा -lboost_system, तो यह इस तरह दिखता था sslsniff_LDFLAGS = -lssl -lboost_filesystem -lpthread -lboost_thread -llog4cpp -lboost_system:। हालांकि यह मदद नहीं की ...
user1049697

1
अभी भी वही त्रुटि? क्या आप autoreconfबाद में भाग गए? इसके अलावा, यह पोस्ट और यह आपके ऑटोटूलस कॉन्फ़िगरेशन में आपकी मदद कर सकता है।
18

2
मैं Makefile.am के sslsniff_LDFLAGSसाथ बदल दिया sslsniff_LDADDऔर यह काम नहीं किया। फिर मैंने दोनों को रखा sslsniff_LDFLAGSऔर जोड़ा sslsniff_LDADD = -lboost_system -lssl -lboost_filesystem -lpthread -lboost_thread -llog4cpp। तब मैं संकलन करने में सक्षम था। सहायता के लिए धनयवाद!
user1049697

62

लापता प्रतीक ( -lboost_system) को परिभाषित करने वाले पुस्तकालय के साथ जोड़ना स्पष्ट समाधान है, लेकिन Boost.System के विशेष मामले में, मूल डिजाइन में एक मिसफिट इसे उपयोग boost::system::generic_category()और boost::system::system_category()अनावश्यक रूप से बनाता है । ध्वज के साथ -DBOOST_SYSTEM_NO_DEPRECATEDसंकलित करना उस कोड को निष्क्रिय कर देता है और कई कार्यक्रमों को बिना आवश्यकता के संकलित करने देता है -lboost_system(यदि आप लाइब्रेरी की कुछ विशेषताओं का स्पष्ट रूप से उपयोग करते हैं तो यह लिंक अभी भी आवश्यक है)।

बूस्ट 1.66 से शुरू और यह कमिट , यह व्यवहार अब डिफ़ॉल्ट है, इसलिए उम्मीद है कि कम और कम उपयोगकर्ताओं को इस उत्तर की आवश्यकता होनी चाहिए।

जैसा कि @AndrewMarshall द्वारा देखा गया है, एक विकल्प को परिभाषित करना है BOOST_ERROR_CODE_HEADER_ONLYजो कोड के केवल हेडर-संस्करण को सक्षम करता है। यह बूस्ट द्वारा हतोत्साहित किया गया क्योंकि यह कुछ कार्यक्षमता को तोड़ सकता है। हालाँकि, १.६ ९ के बाद से, हेडर-ओनली डिफॉल्ट हो गया है , माना जाता है कि यह प्रश्न अप्रचलित है।


4
धन्यवाद!!! कुछ भी नहीं मदद के बाद से मैं 1.41 (Centos SL) को बढ़ावा देने का उपयोग करता हूं जो मुझे मुक्त करता है, -DBOOST_SYSTEM_NO_DEPRECATED का उपयोग कर रहा है
रोजर खरगोश

5
वास्तव में आप जो चाहते हैं वह है -DBOOST_ERROR_CODE_HEADER_ONLY
एंड्रयू मार्शल

1
दिलचस्प है कि नए Boost 1.66 ने system_category () आदि के लिए कम संदर्भ रखने के व्यवहार को लिंक करने के मुद्दों की उपस्थिति में नए लिंक मुद्दों को प्रस्तुत किया जा सकता है । उदाहरण के लिए github.com/PointCloudLibrary/pcl/pull/2236 देखें
पिक्सेलबीट

3
यदि आप CMake का उपयोग करते हैं, तो बस 'add_definitions (-DBOOST_ERROR_CODE_HEADER_ONLY) जोड़ें
निकोल

1
बूस्ट 1.68 के साथ मेरे लिए काम करने वाले एकमात्र निश्चित को परिभाषित करना था BOOST_ERROR_CODE_HEADER_ONLY
सकरा

17

उन लोगों के लिए एक और समाधान जो पूरे शेल्फ की जरूरत नहीं है: स्विच का उपयोग करें

-DBOOST_ERROR_CODE_HEADER_ONLY

यदि आप CMake का उपयोग करते हैं, तो यह है add_definitions(-DBOOST_ERROR_CODE_HEADER_ONLY)


1
मुझे हाल ही में इस समस्या का सामना करना पड़ा। इसके अलावा कुछ भी काम नहीं करता है। मुझे आश्चर्य है कि यह अभी भी मार्क ग्लिस के जवाब में उल्लिखित के रूप में बढ़ावा देने से हतोत्साहित है।
जॉन जेड। ली

1
उद्धरण "Boost.System अब हेडर-ओनली है। एक स्टब लाइब्रेरी अभी भी संगतता के लिए बनाई गई है, लेकिन इसे लिंक करना आवश्यक नहीं है।"
जॉन जेड। ली

16

उपरोक्त त्रुटि एक लिंकर त्रुटि है ... लिंकर एक प्रोग्राम है जो संकलक द्वारा उत्पन्न एक या एक से अधिक वस्तुओं को लेता है और उन्हें एक एकल निष्पादन योग्य प्रोग्राम में जोड़ता है।

-lboost_systemआपको लिंकर फ़्लैग को जोड़ना होगा जो लिंकर को इंगित करता है कि उसे boost::system::system_category()लाइब्रेरी में प्रतीकों की तलाश करनी चाहिए libboost_system.so

यदि आपके पास main.cpp है, तो:

g++ main.cpp -o main -lboost_system

या

g++ -c -o main.o main.cpp
g++ main.o -lboost_system

5
-l और लाइब्रेरी नाम के बीच का स्थान गलत है। आपको 21-45 बजे -lboost_system
portforwardpodcast

1
मैंने पाया कि सेंटो ने -l की स्थिति के बारे में परवाह नहीं की, लेकिन उबंटू ने किया, अंत में होना चाहिए।
पूछा_ियो

7

CMAKE और find_package का उपयोग करते समय, सुनिश्चित करें कि यह है:

find_package(Boost COMPONENTS system ...)

और नहीं

find_package(boost COMPONENTS system ...)

हो सकता है कि कुछ लोगों ने इसके लिए घंटों खो दिया हो ...


6

मुझे भी यही समस्या हुई:

g++ -mconsole -Wl,--export-all-symbols -LC:/Programme/CPP-Entwicklung/MinGW-4.5.2/lib  -LD:/bfs_ENTW_deb/lib   -static-libgcc -static-libstdc++ -LC:/Programme/CPP-Entwicklung/boost_1_47_0/stage/lib   \
 D:/bfs_ENTW_deb/obj/test/main_filesystem.obj \
 -o D:/bfs_ENTW_deb/bin/filesystem.exe -lboost_system-mgw45-mt-1_47 -lboost_filesystem-mgw45-mt-1_47

D: /bfs_ENTW_deb/obj/test/main_filesystem.obj: main_filesystem.cpp :(। पाठ + 0x54): अपरिभाषित संदर्भ को 'बढ़ावा देने के लिए :: प्रणाली': Generic_category ()

समाधान सिस्टम- lib के डिबग-संस्करण का उपयोग करना था:

g++ -mconsole -Wl,--export-all-symbols -LC:/Programme/CPP-Entwicklung/MinGW-4.5.2/lib  -LD:/bfs_ENTW_deb/lib   -static-libgcc -static-libstdc++ -LC:/Programme/CPP-Entwicklung/boost_1_47_0/stage/lib   \
 D:/bfs_ENTW_deb/obj/test/main_filesystem.obj \
 -o D:/bfs_ENTW_deb/bin/filesystem.exe -lboost_system-mgw45-mt-d-1_47 -lboost_filesystem-mgw45-mt-1_47

पर क्यों?


1
क्या ऐसा हो सकता है कि कहीं न कहीं कुछ डिबग ध्वज को परिभाषित किया गया था, इसलिए आपके पास डीबग या जी ++ में बनाए गए अन्य काम थे?
noonex

4

जब मेरे पास यह था, तो समस्या, इसका कारण पुस्तकालयों का क्रम था। इसे ठीक करने के लिए, मैंने libboost_systemआखिरी डाला :

g++ mingw/timer1.o -o mingw/timer1.exe  -L/usr/local/boost_1_61_0/stage/lib \
    -lboost_timer-mgw53-mt-1_61 \
    -lboost_chrono-mgw53-mt-1_61 \
    -lboost_system-mgw53-mt-1_61

यह gcc 5.3 के साथ mingw पर था और एक साधारण टाइमर उदाहरण के साथ 1.61.0 को बढ़ावा दिया।


1
मेरी भी यही समस्या थी। मैंने इसे सीएमके के माध्यम से शामिल किया और, जो भी कारण के लिए, निर्भरता और ऑर्डर को फाइंडबॉस्ट स्क्रिप्ट में काम किया गया था। वास्तव में, हालांकि, मेरी समस्या हमेशा साझा पुस्तकालयों का उपयोग करना और कभी ध्यान न देना, फिर स्थैतिक पुस्तकालयों में जाना और त्रुटियों का निर्माण करना था। उफ़।
एंथनी

इसने मेरे लिए भी इसे ठीक कर दिया ... इस समाधान के लिए पिछले एकमात्र काम जो BSTST_ERROR_CODE_HEADER_ONLY को परिभाषित कर रहा था। उबंटू 18.04 पर, सेमीके साथ 1.68 को बढ़ावा दें। मेरा फिक्स: target_link_lbooks (निष्पादन योग्य sthl crypto boost_system)
लुइस

2

मेरे मामले में, जोड़ना -lboost_systemपर्याप्त नहीं था, फिर भी यह मेरे कस्टम बिल्ड वातावरण में नहीं मिला। मुझे "gcc - / usr / bin / ld: Get lib को नहीं मिला" से छुटकारा पाने के लिए सलाह का उपयोग करना पड़ा और इसके लिए अपनी ./configureकमांड बदलनी चाहिए:

./configure CXXFLAGS="-I$HOME/include" LDFLAGS="-L$HOME/lib -Wl,-rpath-link,$HOME/lib" --with-boost-libdir=$HOME/lib --prefix=$HOME

अधिक जानकारी के लिए बूस्ट 1.51 देखें : "त्रुटि: बूस्ट_थ्रेड के खिलाफ लिंक नहीं कर सका!"


1

... और अगर आप अपने मुख्य रूप से अपने जमुफाइल को मुख्य रूप से जोड़ना चाहते हैं, तो निम्न आवश्यकताओं को पूरा करें:

<link>static
<library>/boost/system//boost_system

और शायद यह भी:

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