2010-07-28 11 views
15

को शिकायत करने में त्रुटि मैं अपने कंप्यूटर पर संकलित करने के लिए multiple_sources.cpp संकलित करने का प्रयास कर रहा हूं। मैं Xubuntu ल्यूसिड लिंक्स पूरी तरह से अद्यतन कर रहा हूँ।लिंक करते समय C++ लाइब्रेरी नहीं मिल पा रहा है, 'boost :: program_options` उदाहरण

यह g++ -c multiple_sources.cpp के साथ इस मुद्दे के बिना संकलित कर देगा लेकिन जब मैं लिंक और मैं g++ multiple_sources.o के साथ एक exectuable बनाने की कोशिश:

multiple_sources.cpp:(.text+0x3d): undefined reference to `boost::program_options::options_description::m_default_line_length' 
multiple_sources.cpp:(.text+0x87): undefined reference to `boost::program_options::options_description::options_description(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int)' 
multiple_sources.cpp:(.text+0x15a): undefined reference to `boost::program_options::options_description::add_options()' 
multiple_sources.cpp:(.text+0x17b): undefined reference to `boost::program_options::options_description_easy_init::operator()(char const*, char const*)' 
multiple_sources.cpp:(.text+0x193): undefined reference to `boost::program_options::options_description_easy_init::operator()(char const*, char const*)' 
multiple_sources.cpp:(.text+0x1af): undefined reference to `boost::program_options::options_description_easy_init::operator()(char const*, boost::program_options::value_semantic const*, char const*)' 
multiple_sources.cpp:(.text+0x1eb): undefined reference to `boost::program_options::options_description::m_default_line_length' 
multiple_sources.cpp:(.text+0x252): undefined reference to `boost::program_options::options_description::options_description(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int)' 
... 

वगैरह विज्ञापन nauseum

मैं पुस्तकालय स्थापित है:

>ls -l /usr/lib/libboost_program_options* 
-rw-r--r-- 1 root root 640800 2010-03-31 21:19 /usr/lib/libboost_program_options.a 
lrwxrwxrwx 1 root root  26 2010-04-09 00:57 /usr/lib/libboost_program_options-mt.a  -> libboost_program_options.a 
lrwxrwxrwx 1 root root  34 2010-04-09 00:57 /usr/lib/libboost_program_options-mt.so -> libboost_program_options.so.1.40.0 
lrwxrwxrwx 1 root root  34 2010-04-09 00:57 /usr/lib/libboost_program_options.so -> libboost_program_options.so.1.40.0 
-rw-r--r-- 1 root root 289336 2010-03-31 21:19 /usr/lib/libboost_program_options.so.1.40.0 

जी ++ आदमी पेज पढ़ने के बाद, मैं भी कोशिश की है:

  • g++ -llibboost_program_options multiple_sources.cpp
  • g++ -llibboost_program_options.a multiple_sources.cpp
  • g++ -llibboost_program_options.so multiple_sources.cpp
  • और सभी ऊपर के -L/usr/lib के साथ -l

वे सभी पर एक बदलाव के साथ असफल से पहले:

/usr/bin/ld: cannot find -llibboost_program_options.so 
collect2: ld returned 1 exit status 

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

उत्तर

24

-l परम गलत है; lib प्री-फ़िक्स से छुटकारा पाएं और -lboost_program_options का उपयोग करें।

लिंकर सभी पुस्तकालयों को lib से शुरू होने की उम्मीद करता है, और पुस्तकालय निर्दिष्ट करते समय इसे छोड़ने के लिए आपको छोड़ देता है।

आप -l (उदा। g++ multiple_sources.cpp /usr/lib/libboost_program_options.so) के बिना फ़ाइलों की सूची में लाइब्रेरी का पूरा पथ भी शामिल कर सकते हैं, लेकिन सिस्टम पुस्तकालयों के लिए, सम्मेलन का पालन करना बेहतर है; वे हमेशा /usr/lib में स्थापित नहीं होते हैं।

+2

यह सही है। उलझन में, लिंकर सभी पुस्तकालयों को 'lib' के साथ शुरू होने की उम्मीद करता है, और पुस्तकालय निर्दिष्ट करते समय इसे छोड़ने के लिए। –

+0

@ माइक धन्यवाद! मैं बस पूछने वाला था कि वह क्यों था। अब यह आवश्यक है? क्या उस पर ओवरराइड करने का कोई तरीका है? मैं अब उत्सुकता से पूछता हूं। – ArtB

+1

@ArtB: मुझे लगता है कि आप फ़ाइलों की सूची में पुस्तकालय के लिए पूर्ण पथ भी शामिल कर सकते हैं, बिना '-l' (उदा।' G ++ multiple_sources.cpp/usr/lib/libboost_program_options.so')। लेकिन सिस्टम पुस्तकालयों के लिए सम्मेलन का पालन करना बेहतर है; वे हमेशा '/ usr/lib' में स्थापित नहीं होते हैं। –

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