2010-12-27 9 views
6

मैं इस तरह कुछ परिदृश्य है:एक ही libs (समान नाम के साथ) के दो अलग-अलग संस्करण एक आवेदन में मौजूद हो सकते हैं?

उत्पाद-> platform-> mylibs (संस्करण-1)

उत्पाद-> mylibs (संस्करण-2)

यानी उत्पाद mylibs (संस्करण -2 का उपयोग करता है) सीधे। उत्पाद प्लेटफार्म का भी उपयोग करता है (जो एक गतिशील lib भी है) और मंच मेरे libs (संस्करण -1) का उपयोग करता है।

उत्पाद और प्लेटफ़ॉर्म द्वारा उपयोग की जाने वाली libs के नाम समान हैं। केवल संस्करण अलग हैं और ये दोनों संस्करण संगत नहीं हैं।

क्या लिनक्स में ".so" libs के साथ कोई तरीका है कि प्लेटफ़ॉर्म एक संस्करण से लिंक कर सकता है और उत्पाद एक ही नाम वाले समान libs के किसी अन्य संस्करण से लिंक कर सकता है?

+0

आप केवल libs के नाम क्यों नहीं बदलते? –

उत्तर

6

नोट, यहां तक ​​कि libs के नाम भी बदलना डिफ़ॉल्ट रूप से पर्याप्त नहीं होगा, क्योंकि प्रतीक नाम संघर्ष करेंगे। आपकी libs को soname और संस्करण वाले प्रतीकों का उपयोग करना चाहिए, इस मामले में उन्हें भी वही कहा जा सकता है।

$ make 
gcc -shared -fpic -Wl,-soname -Wl,libmylibs.so.1 -Wl,--default-symver -o libmylibs.so.1 mylibs1.c 
gcc -shared -fpic -Wl,-soname -Wl,libmylibs.so.2 -Wl,--default-symver -o libmylibs.so.2 mylibs2.c 
gcc -shared -fpic -Wl,-soname -Wl,libplatform.so.1 -Wl,--default-symver -Wl,--default-imported-symver -o libplatform.so.1 platform.c libmylibs.so.1 
gcc -Wl,-rpath-link -Wl,. -Wl,--default-imported-symver -o program program.c libplatform.so.1 libmylibs.so.2 
/usr/bin/ld: warning: libmylibs.so.1, needed by libplatform.so.1, may conflict with libmylibs.so.2 
$ LD_LIBRARY_PATH=$PWD ldd ./program 
    linux-vdso.so.1 => (0x00007fff1e3ff000) 
    libplatform.so.1 => /tmp/so-4539442/libplatform.so.1 (0x00007f6dc3ba0000) 
    libmylibs.so.2 => /tmp/so-4539442/libmylibs.so.2 (0x00007f6dc399f000) 
    libc.so.6 => /lib/libc.so.6 (0x00007f6dc364c000) 
    libmylibs.so.1 => /tmp/so-4539442/libmylibs.so.1 (0x00007f6dc344b000) 
    /lib64/ld-linux-x86-64.so.2 (0x00007f6dc3da1000) 
$ LD_LIBRARY_PATH=$PWD ./program 
lib version 2, platform lib version 1 
+0

उत्तर के लिए धन्यवाद। लेकिन, मुझे समझ में नहीं आया कि यह चेतावनी क्यों है "/ usr/bin/ld: चेतावनी: libmylibs.so.1, libplatform.so.1 द्वारा आवश्यक, libmylibs.so.2 के साथ संघर्ष हो सकता है" जीसीसी द्वारा फेंक दिया गया है? – Jay

+0

मुझे लगता है कि ऐसा इसलिए है क्योंकि जीसीसी यह जांच नहीं करता है कि सभी प्रतीकों का संस्करण है या नहीं, इसलिए यह चेतावनी देता है कि कुछ संघर्ष कर सकते हैं। साथ ही, उच्च स्तर पर, दो पुस्तकालय संचालन के दौरान संघर्ष कर सकते हैं, जैसे कि दोनों एक ही संसाधन को नियंत्रित करना चाहते हैं। – Jester

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

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