2009-05-27 9 views
28

कहें कि मेरे पास a.so और b.so है। क्या मैं सी और एस को एक साझा साझा लाइब्रेरी के रूप में उत्पादित कर सकता हूं, जिसमें सभी एंट्रा-निर्भरताओं को हल करने के लिए निश्चित रूप से सभी कार्यों को हल किया जा सकता है (यानी बीएसओ के सभी कार्यों को .so और अन्य तरीकों से बुलाया जाता है)?एकाधिक मर्ज करें। इसलिए साझा लाइब्रेरी

मैं

gcc -shared -Wl,soname,c.so -o c.so a.so b.so

कोशिश की, लेकिन यह काम नहीं करता।

ही हो जाता है तो मैं a.a और b.a (जो a.o और b.o संशोधित नहीं करना चाहिए) में a.o और b.o संग्रह करना तथा

gcc -shared -Wl,soname,c.so -o c.so a.a b.a

धन्यवाद

+0

अंत में मैं एक ग्रुप जो मुझे एक भी एक के रूप में सभी छोटे पुस्तकालयों दिखा सकता है, के साथ एक पुस्तकालय स्क्रिप्ट का उपयोग का सहारा लिया है, लेकिन एक सॉफ्टवेयर सिर्फ "उप"-पुस्तकालय से लिंक कर सकता है। – Metiu

उत्तर

38

कई साझा पुस्तकालयों में विलय करना वास्तव में सभी यूनिक्स पर व्यावहारिक रूप से असंभव है, एईक्स को छोड़कर: लिंकर एक "अंतिम" उत्पाद मानता है।

लेकिन .so में अभिलेखागार विलय एक समस्या नहीं होनी चाहिए:

gcc -shared -o c.so -Wl,--whole-archive a.a b.a -Wl,--no-whole-archive 
+0

उपयोगी ध्वज के लिए धन्यवाद: संपूर्ण संग्रह! –

+0

क्या अभिलेखागार का आदेश यहां मायने रखता है? अगर मेरे पास .a फाइलों का समूह है, तो क्या मैं * .a का उपयोग कर सकता हूं? – Raj

+1

@राज नहीं, आदेश कोई फर्क नहीं पड़ता - वे सभी को पूरी तरह से शामिल किया जाएगा। यदि आपके पास * '.a' में कोई प्रतीक पुनर्वितरण नहीं है, तो' * .a' केवल काम करेगा (टीएम)। –

7

व्यवहार में यह संभव नहीं है।

लिंकर बिंदु से, एक एसओ लाइब्रेरी एक अंतिम उत्पाद है जिसमें लिंकिंग के लिए आवश्यक स्थानान्तरण जानकारी शामिल नहीं है।

यदि आपके पास दोनों पुस्तकालयों के लिए स्रोत या ऑब्जेक्ट फ़ाइलों तक पहुंच है, तो यह उनसे संयुक्त एसओ को संकलित/लिंक करने के लिए सरल है।

+1

"यदि आपके पास दोनों पुस्तकालयों के लिए स्रोत या ऑब्जेक्ट फ़ाइलों तक पहुंच है, तो यह उनसे संयुक्त एसओ को संकलित/लिंक करने के लिए सरल है।" --- मैं यह कैसे करु ? विशेष रूप से, एंड्रॉइड मंच पर। –

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