2011-06-14 18 views
7

मैं दो पुस्तकालयों, उदाहरण दो टोस्टर पुस्तकालयों libtoaster_a.so और libtoaster_b.so और सभी संबद्ध प्रमुख/लघु/राजस्व सिमलिंक libtoaster_a.so.1.0.0 जैसे के लिए है आदि दोनों पुस्तकालय एक ही टोस्टर इंटरफ़ेस को लागू करते हैं, लेकिन बस प्रक्रिया को अलग-अलग करते हैं। इसलिए जब मैं लाइब्रेरी का उपयोग करने वाले किसी एप्लिकेशन का निर्माण करता हूं, इससे कोई फ़र्क नहीं पड़ता कि किस प्रकार उपयोग किया जाता है (अनुप्रयोग परिप्रेक्ष्य से वे समान होते हैं)।जीसीसी लिंक साझा पुस्तकालय

क्योंकि मैं जो पुस्तकालय का उपयोग करने के बाद आवेदन संकलित किया गया है और वितरित मैं जो libtoaster.so.1 जो तब इंगित कर सकते हैं या तो libtoaster_a के लिए अंक libtoaster.so एक प्रतीकात्मक कड़ी बनाने का फैसला करना चाहते हैं .so.1 और libtoaster_b.so.1। इसलिए उपयोगकर्ता/इंस्टॉलर उपयोग करने के लिए कार्यान्वयन का चयन करने के लिए बस libtoaster.so.1 लिंक बदल सकता है।

निर्माण के लिए कहते हैं कि मैं डिफ़ॉल्ट रूप से libtoaster.so.1 जुड़ा हुआ libtoaster_a.so.1 को है। जब मैं अपने आवेदन को संकलित करता हूं उदाहरण: my_appgcc -o my_app -ltoaster... जैसे कुछ इसे संकलित करता है और libtoaster_a.so.1 के साथ भी चलता है। लेकिन अगर मैं my_app पर ldd चलाने मैं इसलिए libtoaster.so.1 लिंक कोई प्रभाव नहीं है बदल रहा है यह libtoaster_a.so.1 बजाय libtoaster.so.1 के रूप में वांछित से जुड़ा हुआ है देखेंगे,।

वहाँ libtoaster_a.so.1 बनाने, libtoaster.so.1 लिए इसका नाम, इस पुस्तकालय के खिलाफ my_app बनाने तो libtoaster.so.1 को हटाने और इसे बनाने की तुलना में इसे ठीक करने के लिए एक अच्छा तरीका है एक प्रतीकात्मक लिंक के रूप में फिर से?

उत्तर

5

जब आप साझा लाइब्रेरी बनाते हैं, तो "-Wl, -soname = libtoaster.so.1" को जीसीसी झंडे में जोड़ें (मान लें कि आप जीसीसी से लिंक कर रहे हैं)। यह लाइब्रेरी में DT_SONAME सेट करता है, और फ़ाइल के नाम के बजाय DT_SONAME से ली गई लाइब्रेरी का नाम रखने के लिए उस लाइब्रेरी से जुड़े किसी भी एप्लिकेशन को मजबूर करेगा।

[[email protected]]~/cprog/toaster1$ gcc -c my_app.c 
[[email protected]]~/cprog/toaster1$ gcc -c toaster.c 
[[email protected]]~/cprog/toaster1$ gcc -o libtoaster_a.so -shared -Wl,-soname=libtoaster.so toaster.o 
[[email protected]]~/cprog/toaster1$ gcc -R$(pwd) -L. -ltoaster_a -o my_app my_app.o 
[[email protected]]~/cprog/toaster1$ ldd my_app 
my_app: 
my_app: can't load library 'libtoaster.so' 
my_app: exit status 4 
[[email protected]]~/cprog/toaster1$ ln -s libtoaster_a.so libtoaster.so 
[[email protected]]~/cprog/toaster1$ ldd my_app 
my_app: 
    Start End  Type Open Ref GrpRef Name 
    1c000000 3c004000 exe 1 0 0  my_app 
    05b1f000 25b23000 rlib 0 1 0  /home/vps/cprog/toaster1/libtoaster.so 
    084f9000 28532000 rlib 0 1 0  /usr/lib/libc.so.51.0 
    09e80000 09e80000 rtld 0 1 0  /usr/libexec/ld.so 
[[email protected]]~/cprog/toaster1$ 
संबंधित मुद्दे