2013-02-27 17 views
6

के तहत डब्ल्यू/बूस्ट सीरियलाइजेशन को जोड़ने वाले अनसुलझे प्रतीक मैं बताता हूं कि मैं आज रात एक मूर्खता की तरह महसूस कर रहा हूं। मैं बूस्ट सीरियलाइजेशन के साथ आरएचईएल 5.6, जीसीसी 4.1.2, बूस्ट 1.44.0 के तहत एक कार्य समस्या को कम से कम पुन: पेश करने की कोशिश कर रहा हूं।उबंटू 12.10

पर्यावरण मैं के साथ इस समस्या आ रही है उबंटू सर्वर, जीसीसी 4.7.2, और बढ़ावा 1.44.0 के निर्माण (सिस्टम संकलक के खिलाफ, संकुल, आदि) (देव संकुल स्थापित के साथ) है।

मेरा कोड साफ़ रूप से संकलित करता है, लेकिन मुझे विभिन्न boost::archive प्रकारों से संबंधित अपरिभाषित प्रतीकों का असंख्य मिल रहा है।

668 43569 stat("/usr/local/boost/1.44.0/lib/libboost_serialization.so", {st_mode=S_IFREG|0755, st_size=700481, ...}) = 0 
669 43569 open("/usr/local/boost/1.44.0/lib/libboost_serialization.so", O_RDONLY) = 8 

मेरे makefile है:

default: test-app 
all: test-app 

BOOST := /usr/local/boost/1.44.0 

CPPFLAGS := -fPIC -Wall -Wextra -Werror 
INCDIRS := -isystem$(BOOST)/include 
.LIBDIRS. := $(BOOST)/lib 
.LIBS. :=boost_serialization 
LIBS := $(foreach lib,$(.LIBS.),-l$(lib)) 
LIBDIRS := $(foreach dir,$(.LIBDIRS.),-L$(dir)) 
CPPFLAGS += $(INCDIRS) 

base.o : base.cpp base.hpp 
     g++ $(CPPFLAGS) --compile $< -o [email protected] -g 

derived.o : derived.cpp base.hpp derived.hpp 
     g++ $(CPPFLAGS) --compile $< -o [email protected] -g 

main.o: main.cpp derived.hpp 
     g++ $(CPPFLAGS) --compile $< -o [email protected] -g 

test-app: main.o derived.o base.o 
     g++ -o [email protected] $(LIBDIRS) $(LIBS) $^ 

clean: 
     rm -f *.o test 

एक (बहुत) छोटे लिंकर त्रुटियों मैं हो रही है के नमूने की तरह हैं मेरे मेकअप पर strace चल रहा है, मैं यह उम्मीद boost_serialization पुस्तकालय उठा देखना :

base.o: समारोह में void boost::archive::basic_text_oprimitive<std::ostream>::save<boost::archive::class_id_reference_type>(boost::archive::class_id_reference_type const&)': /usr/local/boost/1.44.0/include/boost/archive/basic_text_oprimitive.hpp:91: undefined reference to बढ़ावा :: संग्रह :: archive_exception :: archive_exception (को बढ़ावा देने :: संग्रह :: archive_exception :: exception_code, चार स्थिरांक *, चार स्थिरांक *) '012,351,/usr/local/boost/1.44.0/include/boost/archive/basic_text_oprimitive.hpp:91: अपरिभाषित संदर्भ के लिए boost::archive::archive_exception::~archive_exception()' /usr/local/boost/1.44.0/include/boost/archive/basic_text_oprimitive.hpp:91: undefined reference to बढ़ावा :: संग्रह :: archive_exception :: ~ archive_exception() 'base.o: में फ़ंक्शन void boost::archive::basic_text_oprimitive<std::ostream>::save<boost::archive::tracking_type>(boost::archive::tracking_type const&)': /usr/local/boost/1.44.0/include/boost/archive/basic_text_oprimitive.hpp:91: undefined reference to बूस्ट :: संग्रह :: archive_exception :: archive_exception (boost :: archive :: archive_exception :: upgrade_code, char const *, char const *) ' /usr/local/boost/1.44.0/include/boost/ संग्रह/basic_text_oprimitive.hpp: 91: अपरिभाषित संदर्भ के लिए boost::archive::archive_exception::~archive_exception()' /usr/local/boost/1.44.0/include/boost/archive/basic_text_oprimitive.hpp:91: undefined reference to बढ़ावा :: संग्रह :: archive_exception :: ~ archive_exception() 'base.o: समारोह में void boost::archive::basic_text_oprimitive<std::ostream>::save<unsigned int>(unsigned int const&)': /usr/local/boost/1.44.0/include/boost/archive/basic_text_oprimitive.hpp:91: undefined reference to बढ़ावा :: संग्रह :: archive_exception :: archive_exception (बढ़ावा :: संग्रह :: archive_exception :: upgrade_code, चार कॉन्स *, चार कॉन्स *) ' /usr/local/boost/1.44.0/include/boost/archive/basic_text_oprimitive.hpp:91: boost::archive::archive_exception::~archive_exception()' /usr/local/boost/1.44.0/include/boost/archive/basic_text_oprimitive.hpp:91: undefined reference to बढ़ावा देने के लिए अनिर्धारित संदर्भ :: संग्रह :: archive_exception :: ~

objdump आयकर /usr/local/boost/1.44.0/: archive_exception() '

इसी तरह, अगर मैं संदर्भित .so के पर एक प्रतीक डंप करते हैं, मैं आवश्यक प्रतीकों को देखने के lib/libboost_serialization.so | सी ++ फिल्ट | ग्रेप "को बढ़ावा देने :: संग्रह :: archive_exception :: ~ archive_exception()" 000000000004e670 जी एफ .text 0000000000000065
बढ़ावा :: संग्रह :: archive_exception :: ~ archive_exception() 000000000004e6e0 जी एफ .text 0000000000000009 आभासी को thunk को बढ़ावा देने :: संग्रह :: archive_exception :: ~ archive_exception() 000000000004e6f0 जी एफ .text 0000000000000012
बढ़ावा :: संग्रह :: archive_exception :: ~ archive_exception() 000000000004ed60 जी एफ .text 000000000000005c
बढ़ावा :: संग्रह :: archive_exception :: ~ archive_exception() 000000000004e710 जी एफ।पाठ 0000000000000009 आभासी thunk बढ़ावा देने के लिए :: संग्रह :: archive_exception :: ~ archive_exception()

मैं अब थोड़ी देर के लिए टेबल के खिलाफ मेरे सिर पीटने किया गया है ... उम्मीद कर किसी की मदद कर सकते हैं। मुझे नहीं लगता कि विशिष्ट स्रोत मायने रखता है, लेकिन अगर अनुरोध किया जाता है, तो मैं इसे पोस्ट कर सकता हूं।

अतिरिक्त पर्यावरण विवरण:

जी ++ --version जी ++ मुफ्त सॉफ्टवेयर (Ubuntu/Linaro 4.7.2-2ubuntu1) 4.7.2 कॉपीराइट (सी) 2012 फ्री सॉफ्टवेयर फाउंडेशन, Inc यह वह जगह है ; शर्तों की प्रतिलिपि बनाने के लिए स्रोत देखें। कोई वारंटी नहीं है; व्यापारिकता या किसी विशेष उद्देश्य के लिए फिटनेस के लिए भी नहीं।

ld --version 
GNU ld (GNU Binutils for Ubuntu) 2.22.90.20120924 
Copyright 2012 Free Software Foundation, Inc. 
This program is free software; you may redistribute it under the terms of 
the GNU General Public License version 3 or (at your option) a later version. 
This program has absolutely no warranty. 

साथ ही, इस एक वीएम Windows 8 पर हाइपर-वी के तहत चल रही है, हालांकि, मुझे लगता है कि यहाँ मायने रखती है नहीं लगता।

पूरा लिंक लाइन: जी ++ एल/usr/स्थानीय/बढ़ावा/1.44.0/lib -lboost_serialization -ओ परीक्षण एप्लिकेशन main.o derived.o base.o

+0

बस किसी भी मुद्दे/usr/स्थानीय से बढ़ावा पुस्तकालयों के सेट से हो सकता है अलग करने के लिए हल करना चाहिए, आप अपने Makefile बात करने के लिए खींचने की कोशिश कर सकता है पुस्तकालयों और शीर्षकों में से/usr/lib और/usr/इसके बजाय शामिल हैं और देखें कि यह क्या है वहाँ सफलतापूर्वक संकलित? – Tuxdude

+1

वास्तविक लिंक कमांड 'मेक' चलाना चल रहा है। –

+0

@ एन.एम. ऊपर किया यह है: g ++ -L/usr/local/boost/1.44.0/lib -lboost_serialization -o test-app main.o derived.o base.o –

उत्तर

8

मैं एक ही समस्या मिला है,

जी ++ एल/usr/स्थानीय/बढ़ावा/1.44.0/lib -ओ परीक्षण एप्लिकेशन main.o की तरह अंत में -lboost_serialization डाल derived.o base.o -lboost_serialization

यह

+0

घर जाने के बाद, मैं इसे बाद में एक शॉट दूंगा। –

+0

धन्यवाद, यह काम किया। मैंने '-Wl, - स्टार्ट-ग्रुप $ (LIBS) $^-Wl, - एंड-ग्रुप 'का उपयोग करने का प्रयास किया था, और मेरी समझ आदेश किसी समूह के अंदर कोई फर्क नहीं पड़ता। जब मैंने '-ब्लूएल किया, - $^$ (LIBS) -ब्लूएल, - एंड-ग्रुप 'शुरू करें, लिंक काम किया। अजीब। निश्चित नहीं है कि समूह के भीतर आदेश क्यों महत्वपूर्ण होना चाहिए। –

-1

द्विआधारी वस्तु। ओ libs से जुड़ा हुआ नहीं है।
पहले सत्यापित करें कि /usr/local/boost/1.44.0/lib में फ़ाइल का lib boost_serialization हैं।
और अगला, वह lib पंजीकृत है:
sudo ldconfig -v | grep boost_serialization
यदि नहीं, तो /etc/ld.so.conf.d में उपयोगकर्ता रूट के साथ फ़ाइल boost1.44.0.conf बनाएं। इस लिग्ने
यूएसआर/स्थानीय/बूस्ट/1.44.0/lib
फिर यह आदेश
sudo ldconfig -v | ग्रेप boost_serialization

+3

यह गलत है। कृपया ऐसा मत करो। जब भी आप एक गैर-सिस्टम लाइब्रेरी से लिंक करना चाहते हैं, तो आपको रूट पर जाना और सिस्टम-व्यापी कॉन्फ़िगरेशन को संशोधित नहीं करना चाहिए। –

+0

जब तक आप -L विकल्प का उपयोग करके लिंकर के लिए सही खोज पथ पास करते हैं, तब तक आपको ld.so.conf को स्पर्श करने की आवश्यकता नहीं है। – Tuxdude