2012-03-15 14 views
79

संकलित करते समय मैं उबंटू 11.10 पर एक प्रोग्राम संकलित करने की कोशिश कर रहा हूं जो बूस्ट पुस्तकालयों का उपयोग करता है। मेरे पास उबंटू रिपोजिटरी से 1.46-देव बूस्ट पुस्तकालय स्थापित हैं, लेकिन प्रोग्राम को संकलित करते समय मुझे एक त्रुटि मिलती है।बढ़ावा देने के लिए अनिर्धारित संदर्भ :: system :: system_category()

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

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

+5

यह एक कंपाइलर त्रुटि नहीं है, यह एक _linker_ त्रुटि है। आपको Boost.System लाइब्रेरी से लिंक करने की आवश्यकता है। – ildjarn

उत्तर

138

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

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

+0

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

+1

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

+0

मेकफ़ाइल यहां है: http://pastebin.com/TgkW4V2b – user1049697

13

उपरोक्त त्रुटि एक लिंकर त्रुटि ... लिंकर a program that takes one or more objects generated by a compiler and combines them into a single executable program.

आप झंडे जो लिंकर कि यह पुस्तकालय libboost_system.so में boost::system::system_category() जैसे प्रतीकों के लिए ध्यान देना चाहिए करने के लिए इंगित करता है लिंकर करने के लिए 'एल boost_system' जोड़ना होगा है

g++ main.cpp -o main -lboost_system 

या

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

आप main.cpp, या तो है, तो आवश्यकताओं के लिए निम्न

+5

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

+0

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

1

... और मामले में आप स्थिर आपका मुख्य लिंक करने के लिए चाहता था, अपने Jamfile में जोड़ें:

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

और शायद यह भी:

<linkflags>-static-libgcc 
<linkflags>-static-libstdc++ 
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 

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

समाधान प्रणाली-लिब की डिबग संस्करण का इस्तेमाल किया गया:

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

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

2

मेरे मामले में, -lboost_system जोड़ना पर्याप्त नहीं था, फिर भी यह मेरे कस्टम निर्माण वातावरण में नहीं मिला। मैं Get rid of "gcc - /usr/bin/ld: warning lib not found" पर सलाह का उपयोग करें और करने के लिए अपने ./configure आदेश बदलना पड़ा:

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

के लिए अधिक विवरण देखने के Boost 1.51 : "error: could not link against boost_thread !"

36

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

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

जैसा कि @AndrewMarshall द्वारा देखा गया है, एक विकल्प BOOST_ERROR_CODE_HEADER_ONLY को परिभाषित करना है जो कोड के शीर्षलेख-संस्करण को सक्षम बनाता है। हालांकि, यह बूस्ट द्वारा discouraged है क्योंकि यह कुछ कार्यक्षमता को तोड़ सकता है।

+3

धन्यवाद !!! कुछ भी मदद नहीं मिली क्योंकि मैं बूस्ट 1.41 (सेंटोस एसएल) का उपयोग करता हूं जो मुझे मुक्त करता है, -DBOOST_SYSTEM_NO_DEPRECATED –

+1

का उपयोग कर रहा है यह वास्तव में स्वीकार्य उत्तर आईएमओ होना चाहिए। – einpoklum

+2

वास्तव में आप जो चाहते हैं वह है -DBOOST_ERROR_CODE_HEADER_ONLY –

3

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

find_package(Boost COMPONENTS system ...) 

और

find_package(boost COMPONENTS system ...) 

कुछ लोगों को उस के लिए घंटे खो दी है नहीं ...

0

जब मैं इस किया था , समस्या, कारण पुस्तकालयों का आदेश था।

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 

यह जीसीसी 5.3 के साथ MinGW पर था और एक सरल टाइमर उदाहरण के साथ 1.61.0 बढ़ावा: इसे ठीक करने के लिए, मैं libboost_system पिछले डाल दिया।

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