2012-11-12 15 views
5

की निर्भरता मैं एक छोटे से क्यूटी (C++) लिनक्स पर जीयूआई आवेदन का निर्माण करने की कोशिश कर रहा हूँ से जोड़ने के लिए, लेकिन यह, कई लिंकर त्रुटियों के साथ निर्माण करने के लिए क्यूटी पुस्तकालय मैं रूप से लिंक हो रहा निर्भरता लापता के बारे में शिकायत विफल रहता है। मैंने क्यूटी पुस्तकालयों पर यह पता लगाने के लिए कि पुस्तकालय वास्तव में वहां हैं - और वे हैं।कैसे स्वचालित रूप से साझा पुस्तकालय

मेरे समस्या इस सूत्र में चर्चा करने के लिए संबंधित प्रतीत होती है: Linking dependencies of a shared library और जब कि धागा मुझे मेरे सटीक समस्या की पहचान में मदद की, ऐसा लगता है कि धागे के निष्कर्ष था कि कि अपने आवेदन लिंक करना चाहिए!

आवेदन निम्न आदेश के साथ संकलित किया गया है:

g++ -m64 -Wl,-O1 -o Executable some-object.o some-other-object.o -lQtCore -lQtGui -lQtXml -L/usr/lib64 -L/usr/X11R6/lib64 -lpthread 

चल रहा है इस निम्न प्रपत्र की चेतावनी उत्पन्न करता है, और जोड़ने अंत में ('लापता' पुस्तकालयों में परिभाषित प्रतीकों के लिए) अपरिभाषित संदर्भ त्रुटियों के साथ विफल रहता है:

.../ld: warning: libglib-2.0.so.0, needed by /usr/lib64/libQtGui.so, not found (try using -rpath or -rpath-link) 
.../ld: warning: libpng14.so.14, needed by /usr/lib64/libQtGui.so, not found (try using -rpath or -rpath-link) 
.../ld: warning: libz.so.1, needed by /usr/lib64/libQtGui.so, not found (try using -rpath or -rpath-link) 
.../ld: warning: libfreetype.so.6, needed by /usr/lib64/libQtGui.so, not found (try using -rpath or -rpath-link) 

और इतने पर (कुल 18 निर्भरता कि पाया नहीं जा सका है।)

मैं प्राप्त कर सकते हैं इस संकलन अगर मैं जाओ और स्पष्ट रूप से जोड़ें -lglib, -lpng14, -lz -lfreetype और इसी तरह, लेकिन जैसा कि मैंने बताया है कि 18 निर्भरताएं हैं - और मैं ऐसा नहीं करूँगा। ऐसा लगता है कि मुझे इसे नहीं करना चाहिए।

मैं जो किसी भी मुसीबतों के बिना ठीक उसी Linux distro (openSUSE 12.2) का उपयोग करता है अपने लैपटॉप कंप्यूटर पर एक ही परियोजना तैयार की है। क्यूटी समेत सभी पुस्तकालयों को डिस्ट्रो रिपोजिटरी से स्थापित किया गया था।

मुझे लगता है कि यह मेरा OpenSUSE पर सेटअप समस्या स्थापित किसी प्रकार का हो सकता है, लेकिन मैं जहां इसे ठीक करने के लिए देख शुरू करने के लिए पता नहीं है।

चीयर्स, क्रेग

+0

कुछ मैं मानता हूँ कि यह बस आप सभी निर्भर पुस्तकालयों जोड़े बिना काम करना चाहिए कर सकते हैं। मुझे किसी प्रकार की प्रणाली गलत कॉन्फ़िगरेशन पर संदेह होगा। शायद टूलचेन के टुकड़े को पुनर्स्थापित करना, जैसे कंपाइलर और बिनुटिल्स, मदद कर सकते हैं ...? –

+0

यस्ट का उपयोग करके मैंने binutils को हटा दिया, फिर gcc टूल्स को पुनर्स्थापित किया और अब यह काम करता है। आपके जवाब के लिए धन्यवाद। –

उत्तर

1

ऐसा लगता है कि /usr/lib64/libQtGui.so उन में rpaths hardcoded है निर्भर साझा पुस्तकालयों का पता लगाने की। आपके मेजबानों में से एक पर आवश्यक पुस्तकालय अपेक्षित स्थान पर हैं जबकि दूसरे मेजबान पर वे नहीं हैं।

आप पता लगाने के लिए जहां यह दिखेगा क्यूटी साझा लाइब्रेरी से बाहर RPATH पाने के लिए elfdump की तरह कुछ का उपयोग कर सकते हैं। तो फिर तुम (मेरा मानना ​​है कि) -R अपने लिंक कमांड लाइन पर जहां पुस्तकालयों वास्तव में कि मेजबान पर स्थापित कर रहे हैं करने के लिए यह इंगित करने के लिए उपयोग कर सकते हैं।

संपादित करें: मुझे लगता है कि आप की तरह objdump -x <binary/library> | grep -i rpath

+0

मेरे लिए निश्चित चीजों के ऊपर जैमी के सुझावों के बाद, लेकिन आपके उत्तर पर एक फॉलो अप के रूप में। ओपनस्यूज elfdump के साथ नहीं आता है। किसी भी विचार से मुझे इस प्रणाली पर एक एल्फ फ़ाइल में एम्बेडेड RPATH कैसे मिलेगा। मैंने objdump और readelf कोशिश की, और उनके उत्पादन में पुस्तकालयों के संदर्भ मिला, लेकिन एक आरपीएटीएच के बारे में कुछ भी नहीं। –

+0

मैं इसके लिए 'chrpath' का उपयोग करता हूं। डेबियन में, यह 'chrpath' पैकेज में है, आश्चर्यजनक रूप से। :-) मुझे लगता है कि 'ओब्जडम्प' भी काम करेगा, लेकिन यदि बाइनरी में कोई रैपथ नहीं है, तो आपको बस कोई आउटपुट नहीं दिखाई देगा, इसलिए यह बताना मुश्किल है कि यह भी परीक्षण करने के लिए आरपीएथ-एन्क्रिप्टेड बाइनरी ढूंढने के बिना काम कर रहा है या नहीं। –

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