2013-02-15 18 views
15

मुझे जीसीसी/लिनक्स के साथ साझा लाइब्रेरी बनाने में समस्या है। वर्तमान में यह साझा लाइब्रेरी जीसीसी/libtool विकल्प "-shared" के साथ बनाई गई है और सब कुछ ठीक है।निर्माण के दौरान एक साझा लाइब्रेरी को एक स्थिर लाइब्रेरी से लिंक करें?

अब दो अतिरिक्त, स्थैतिक पुस्तकालय (.a-files) हैं जिन्हें साझा किए गए एक द्वारा प्रदान की जाने वाली कुछ कार्यक्षमता प्रदान करने के बाद इस साझा किए गए में जोड़ा जाना है। विकल्प "-l" के साथ इन स्थैतिक पुस्तकालयों को जोड़ने से मदद नहीं मिलती है, बाद में वे .so फ़ाइल का हिस्सा नहीं हैं।

तो मैं साझा पुस्तकालय में वास्तव में इन स्थिर पुस्तकालयों के कोड को जोड़ने के लिए जीसीसी/libtool को कैसे मजबूर कर सकता हूं?

धन्यवाद!

+0

तुम सिर्फ जीसीसी के निर्माण के विकल्प के लिए स्थिर पुस्तकालय का पूरा पथ में जोड़ सकते हैं निष्पादनयोग्य बनाने के लिए, जैसे: 'gcc -Wall -g live_mystuff.c -o my_app /usr/local/src/ffmpeg/libswscale/libswscale.a -lpthread -lbz2 -lm -lz -lfaac -lmp3lame -lx264 -lfaad ... 'यह साझा पुस्तकालय बनाने के लिए भी काम कर सकते हैं। कोशिश करो। – fritzone

+0

आप कैसे जानते हैं कि वे ".so फ़ाइल का हिस्सा नहीं हैं"? –

+0

@ फ़्रिज़ज़ोन: निष्पादन योग्य के लिए जो बिना किसी समस्या के काम करता है, मुझे इसे साझा लाइब्रेरी – Elmi

उत्तर

21

आपको इस मामले में --whole-archive लिंकर विकल्प की आवश्यकता है ताकि लिंकर को साझा स्थिर lib में पूरी स्थिर libs 'सामग्री शामिल करने के लिए आदेश दिया जा सके।

g++ -shared sample.o -o libSample.so -Wl,-whole-archive -lmylib1.a -lmylib2.a -Wl,-no-whole-archive 

man ld से:

प्रत्येक संग्रह --whole-संग्रह विकल्प के बाद कमांड लाइन पर उल्लेख के लिए, लिंक में संग्रह में हर वस्तु फ़ाइल के बजाय खोज में शामिल आवश्यक ऑब्जेक्ट फ़ाइलों के लिए संग्रह। इसका उपयोग आम तौर पर एक साझा लाइब्रेरी में एक संग्रह फ़ाइल को चालू करने के लिए किया जाता है, जिससे प्रत्येक ऑब्जेक्ट को परिणामी साझा लाइब्रेरी में शामिल किया जा सकता है। यह विकल्प एक से अधिक बार इस्तेमाल किया जा सकता है।

जीसीसी से इस विकल्प का उपयोग करते समय दो नोट्स: सबसे पहले, जीसीसी इस विकल्प के बारे में नहीं जानता है, इसलिए आपको -Wl, -hhole-archive का उपयोग करना होगा। दूसरा, अभिलेखागार की सूची के बाद -Wl, -no-whole-archive का उपयोग करना न भूलें, क्योंकि जीसीसी आपके लिंक पर अभिलेखागार की अपनी सूची जोड़ देगा और आप यह ध्वज उन लोगों को प्रभावित नहीं करना चाहेंगे।

+0

सनोस पर मुझे '-WL' के बाद बॉट डैश का उपयोग करना पड़ा। – stefanct

2

आप केवल पुस्तकालय शामिल करने के लिए बल लिंकर को --whole-संग्रह पैरामीटर की आवश्यकता है, लेकिन यह बेजोड़ प्रतीकों से अपनी खुद की जरूरतों का अनुमान लगाने के लिए सक्षम होना चाहिए।

सुनिश्चित करें कि कमांड लाइन पर किसी भी स्थिर पुस्तकालयों उनके आश्रित वस्तु फ़ाइलों के बाद आते हैं जैसे:

g++ -Wl,-E -g -pipe -O2 -pipe -fPIC myobjectfile.o mystaticlibrary.a -shared -o mylib.so 
संबंधित मुद्दे

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