2013-01-06 15 views
5

मैं सफलतापूर्वक libawesomium-1.6.5.so के खिलाफ लिंक कर सकते हैं:, साझा लाइब्रेरी से लिंक हो रहा कस्टम LD_LIBRARY_PATH बिना कार्यक्रम बुला

-L-L. 
-L-lawesomium-1.6.5 
-L-ldl 

libawesomium-1.6.5.so मेरी निष्पादन उसी निर्देशिका में है, अब अगर मैं अपने कार्यक्रम को फोन करने की कोशिश (मैं फोन करता हूँ यह अब के लिए ठेला), यह मौजूद है के साथ:

./prog: error while loading shared libraries: libawesomium-1.6.5.so.0: cannot open shared object file: No such file or directory 

तो मैं एक सिमलिंक libawesomium-1.6.5.so.0libawesomium-1.6.5.so की ओर इशारा करते, prog फिर से चलाने के लिए मुझे एक ही त्रुटि देता है बनाने के लिए, एक कस्टम 012 के साथ बुलाकाम करता है, लेकिन मैं prog वितरित करना चाहता हूं और मैं चाहता हूं कि उपयोगकर्ता रूट-राइट्स के साथ prog का उपयोग करने में सक्षम हो (/usr/lib आदि में awesomium इंस्टॉल करें) और LD_LIBRARY_PATH सेट करने की आवश्यकता के बिना। एक विकल्प एक शेल स्क्रिप्ट होगा जो LD_LIBRARY_PATH सेट करता है, लेकिन मैं एक अलग तरीका पसंद करूंगा (मैंने LD_LIBRARY_PATH सेटिंग भी खराब विचार किया है)।

इसके अलावा, अगर libawesomium-1.6.5.so.0 पर सिम्लिंक बनाने की आवश्यकता नहीं है तो यह बहुत अच्छा होगा।

संपादित करें:

पासिंग लिंकर कार्यों के लिए -rpath=.! लेकिन दुर्भाग्य से awesomium इसके साथ सौदा नहीं कर सकते हैं:

/.../awesomium_test/AwesomiumProcess: error while loading shared libraries: libawesomium-1.6.5.so.0: cannot open shared object file: No such file or directory 

-rpath का उपयोग करना और LD_LIBRARY_PATH की स्थापना prog अंदर काम करता है

उत्तर

6

यदि आप जीसीसी का उपयोग करते हैं, तो आप -Wl,-rpath=lib_directory को lib_directory निर्देशिका में लाइब्रेरी खोजने के लिए निष्पादन योग्य बनाने के लिए पास कर सकते हैं।

इसके अलावा, यह तर्क एक विशेष मान $ORIGIN स्वीकार करता है जो निष्पादित प्रोग्राम वाली निर्देशिका का प्रतिनिधित्व करता है। तो यदि आप gcc के लिए -Wl,-rpath='$ORIGIN' पास करते हैं तो आप प्रोग्राम की तुलना में उसी निर्देशिका में libawesomium-1.6.5.so रखने में सक्षम होंगे।

+0

वाह यह काम करता है, धन्यवाद! अच्छी तरह से नहीं, मेरा संपादन देखें। – dav1d

+0

मैंने इसे समझ लिया! मैं अपने कार्यक्रम के अंदर awesomium लोड करने से पहले 'LD_LIBRARY_PATH' सेट कर सकते हैं। – dav1d

+0

आपको '-Wl, -rpath =' $ ORIGIN ''-Wl, -rpath = .' और LI_LIBRARY_PATH के बजाय बेकार होना चाहिए। – Julien

1

क्योंकि त्रुटि है। आपके रास्ते में नहीं है आपके विकल्प एक बैश स्क्रिप्ट वितरित करना है जो LD_LIBRARY_PATH सेट के साथ बाइनरी चलाता है, जैसा कि आप कहते हैं, या साझा ऑब्जेक्ट को/usr/lib या/usr/local/lib या जहां भी उस विशेष प्लेटफ़ॉर्म पर उपयुक्त हो, कॉपी करने के लिए।

वास्तव में कोई शॉर्टकट नहीं है, जब तक कि आप स्थिर रूप से लिंक नहीं करना चाहते।

+0

हाँ, मैं दोनों तरीकों से बचना चाहता था। यह स्पष्ट करने के लिए धन्यवाद कि कोई दूसरा रास्ता नहीं है। सांख्यिकीय रूप से लिंकिंग काम नहीं करती है, क्योंकि awesomium के लिए कोई स्थैतिक lib नहीं है (बंद स्रोत, केवल .so प्रदान किया जाता है) – dav1d

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