2009-03-17 16 views
40

मेरे पास एक थर्ड-पार्टी लाइब्रेरी है जिसमें मुख्य रूप से बड़ी संख्या में स्थैतिक (.a) लाइब्रेरी फ़ाइलें शामिल हैं। मैं इसे एक .a लाइब्रेरी फ़ाइल में संकलित कर सकता हूं, लेकिन मुझे वास्तव में इसे .so साझा लाइब्रेरी फ़ाइल होने की आवश्यकता है।एक साझा लाइब्रेरी में एक स्थिर लाइब्रेरी को कनवर्ट करें?

क्या स्थिर .a फ़ाइल को साझा .so फ़ाइल में परिवर्तित करने का कोई तरीका है? या अधिक आम तौर पर ऑब्जेक्ट फ़ाइलों के साथ एक .so फ़ाइल में स्थिर .a फ़ाइलों की एक बड़ी संख्या को गठबंधन करने का एक अच्छा तरीका है?

उत्तर

34

इस

gcc -shared -o megalib.so foo.o bar.o -la_static_lib -lb_static_lib 

ऐसा नहीं (उचित एल निश्चित रूप से के साथ) करता है?

+3

जीसीसी-शेर का उपयोग करके चाल चल रही थी, लेकिन केवल बाद में मैंने -पीपीआईसी के साथ पुन: संकलित किया। मुझे सही दिशा बताने के लिए धन्यवाद! –

17

यदि आप स्थैतिक पुस्तकालय के भीतर वस्तुओं को -एफपीआईसी या पसंद किए बिना संकलित करते हैं तो आप ऐसा नहीं कर सकते हैं।

+2

अच्छी तरह से समर्थित लक्ष्यों पर, साझा लाइब्रेरी कोड के लिए 'PIC' आवश्यक नहीं है। कुछ प्रदर्शनों के खर्च पर यह स्मृति के अधिक कुशल उपयोग (बहुमत की बजाय, अल्पसंख्यकों के बजाय, साझा किए जा सकते हैं) के परिणामस्वरूप होता है। –

+3

-एफपीआईसी की अनुपस्थिति या कुछ स्थितियों की तरह परिणामस्वरूप कमांड लाइन के अंत में सेगफॉल्ट –

9
g++ -shared -o megalib.so foo.o bar.o -Wl,--whole-archive -la_static_lib -lb_static_lib -Wl,--no-whole-archive -lc_static_lib -lother_shared_object 

मैं जीसीसी बारे में निश्चित नहीं हूँ, लेकिन जी के लिए ++ मैं साझा वस्तु में स्थिर पुस्तकालयों से वस्तुओं को शामिल करने के --whole-संग्रह लिंकर विकल्प जोड़ने के लिए किया था। यदि आप libc_static_lib.a और libother_shared_object.so से लिंक करना चाहते हैं, तो --no-whole-archive विकल्प आवश्यक है, लेकिन उन्हें megalib.so में पूरी तरह से शामिल नहीं करना है।

+1

'-Wl - no-whole-archive' आवश्यक है। देखें [प्रश्न संपादित करें, यहां] (http://stackoverflow.com/questions/7935421/linking-archives-a-into-shared-object-so)। – ofavre

1

ar -x भी उपयोगी हो सकता है यदि आप अपने .a एस से विशिष्ट वस्तुओं पर ध्यान केंद्रित करना चाहते हैं और आप स्वयं को कुछ भी नहीं जोड़ना चाहते हैं।

4
ar -x lib***.a 
gcc -shared *.o -o lib***.so 
संबंधित मुद्दे

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