2009-08-20 9 views
6

मुझे lib कोड उपसर्ग के बिना साझा कोड में मेरे कोड को लिंक करना होगा। (कहें, foo.so) पहली समस्या है -l विकल्प फ़ाइल नहीं मिला है। तो मैं सीधे इस तरह पिछले संकलन करने के लिए इस फ़ाइल सहित करने की कोशिश की:lib के बिना किसी साझा लाइब्रेरी से लिंक कैसे करें * एक अलग निर्देशिका में उपसर्ग?

जीसीसी एक Ao /PATH/TO/FOO/foo.so

लेकिन इस मामले में, एक कठिन एक के रूप में foo.so से जुड़ा हुआ है निरपेक्ष पथ में "ldd एक" के रूप में देखा:

/PATH/TO/FOO/foo.so

अंतिम तैनाती दोनों फ़ाइलों को एक ही फ़ोल्डर में किया जा रहा अंत आरंभ करेगा, तो यह सामान्य लिंक होना चाहिए, पूर्ण पथ नहीं। मैं यह कैसे कर सकता हूँ?

+0

संभावित डुप्लिकेट [कैसे -l बिना जीसीसी का उपयोग कर से जोड़ने के लिए और न ही लाइब्रेरी के लिए हार्डकोडिंग पथ जो libNAME.so नामकरण सम्मेलन का पालन नहीं करता है?] (http://stackoverflow.com/questions/207069/how-to-link-using-gcc-without-l-nor-hardcoding-path- के लिए एक पुस्तकालय है कि-करता-नहीं) –

उत्तर

6

-Wl, -rpath ,. -> lib फ़ाइलों को खोजने के लिए वर्तमान निर्देशिका का उपयोग करने के लिए। (यहां तक ​​कि यदि संकलन में नहीं मिला है, तो रन-टाइम पर ठीक है) -llibrary के बजाय -> लाइब्रेरी का उपयोग करें।

ऐसा लगता है कि यह सही तरीके से काम करता है। आशा है कि किसी को भी यह उपयोगी लगेगा।

12

एक ELF मंच मान लिया जाये कि, अगर आप foo.so के पुनर्निर्माण कर सकते हैं:
- सबसे अच्छा ठीक बस इसे libfoo.so
नाम के लिए है - अगला सबसे अच्छा ठीक उस पर SONAME स्थापित करने के लिए है:

gcc -Wl,-soname,foo.so -o foo.so foo.o 

जब आप

gcc -o a.out a.o /path/to/foo.so 

केवल SONAME निर्भरता, नहीं एक पूर्णके रूप में दर्ज किया जाएगा: के साथ बाद में लिंक।

आप foo.so पुनर्निर्माण नहीं कर सकता है, तो इस कार्य करें:

rm -f foo.so && ln -s /path/to/foo.so foo.so && 
    gcc -o a.out a.o ./foo.so && rm -f foo.so 
संबंधित मुद्दे

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