2010-02-03 10 views
9

इस प्रश्न का शीर्षक exact dupe है, लेकिन उस प्रश्न के उत्तर में मेरी मदद नहीं है।एक साझा लाइब्रेरी में एक साझा लाइब्रेरी को कनवर्ट करें (libsome.a से libsome.so बनाएं): मेरे प्रतीक कहां हैं?

% g++ -std=c++98 -fpic -g -O1 -c -o foo.o foo.cpp 
% g++ -std=c++98 -fpic -g -O1 -c -o bar.o bar.cpp 
% ar -rc libsome.a foo.o bar.o 

मैं बजाय वस्तु फ़ाइलों के libsome.a से libsome.so उत्पन्न करने के लिए चाहते हैं, लेकिन पुस्तकालय वास्तव में है:

मैं एक स्थिर पुस्तकालय में पैक वस्तु फ़ाइलों का एक समूह है barebones:

% g++ -std=c++98 -fpic -g -O1 -shared -o libsome.so libsome.a 
% nm -DC libsome.so 
0000xxxx A _DYNAMIC 
0000xxxx A _GLOBAL_OFFSET_TABLE_ 
     w _Jv_RegisterClasses 
0000xxxx A __bss_start 
     w __cxa_finalize 
0000xxxx A _edata 
0000xxxx A _end 
0000xxxx T _fini 
0000xxxx T _init 

स्थिर पुस्तकालय ठीक है, या कम से कम मैं पूरी तरह से एक निष्पादन से लिंक कर सकती हूं और यह निहित कार्यक्षमता को चलाने की है। भी, सब ठीक है अगर मैं libsome बनाते हैं। तो foo.o और bar.o से।

उत्तर

22

मान लें कि आप जीएनयू लिंकर का उपयोग कर रहे हैं, आपको - व्हाहोल-संग्रह विकल्प निर्दिष्ट करने की आवश्यकता है ताकि आपको स्थिर संग्रह की सभी सामग्री मिलें। के बाद से है कि एक लिंकर विकल्प है, तो आप लिंकर को इसके माध्यम से पारित करने के लिए जीसीसी बताने के लिए -Wl की आवश्यकता होगी:

g++ -std=c++98 -fpic -g -O1 -shared -o libsome.so -Wl,--whole-archive libsome.a 

आप जहां पुस्तकालय के सभी चाहते हैं कुछ और अधिक जटिल कर रहे थे तो कुछ लेकिन केवल लाइब्रेरी का हिस्सा libsome द्वारा आवश्यक समर्थन, आप पूरे संग्रह को बंद करना चाहते हैं आप libsome पर यह उपयोग करने के बाद:

... -Wl,--whole-archive libsome.a -Wl,--no-whole-archive libsupport.a 

आप जीएनयू लिंकर उपयोग नहीं कर रहे हैं, तो आप अपने लिंकर यह समर्थन करता है तो यह देखने के लिए की आवश्यकता होगी और इसे क्या कहा जाता है। सूर्य लिंकर पर, इसे -z allextract और -z defaultextract कहा जाता है।

+0

+1 वहां आप जाते हैं। मैंने "मैन एलडी" की कोशिश की और उसे याद किया। –

+0

धन्यवाद, यह है! मैंने एलडी मैनपेज को ऊपर और नीचे खोजा है, लेकिन किसी भी तरह से इस विकल्प को याद किया है। –

+0

अब अगर केवल यह उत्कृष्ट उत्तर यह संकेत देना था कि इसे सीएमके परियोजना के साथ कैसे सेट अप करें! धन्यवाद –

1

आपकी फ़ाइलों को .a फ़ाइल से नहीं खींचा जा रहा है क्योंकि कुछ भी उनका संदर्भ नहीं दे रहा है। आप पहले .a फ़ाइल क्यों बना रहे हैं? आप -r विकल्प के साथ उन्हें जोड़कर एक .o फ़ाइल बनाने के लिए बेहतर भाग्य चाहते हैं।

+0

जब मैं lib.ome और bar.o से libsome.so बनाता हूं, तो प्रतीकों का संदर्भ कुछ भी नहीं है, और फिर भी वे लाइब्रेरी में समाप्त होते हैं। और चूंकि '.a' फ़ाइल केवल उन दो सटीक '.o' फ़ाइलों को एक साथ थप्पड़ मार दी गई है, वहां * निहित ऑब्जेक्ट फ़ाइलों के स्थान पर इसका उपयोग करने के लिए एक (सरल) तरीका होना चाहिए, नहीं? –

+0

क्योंकि ऑब्जेक्ट फ़ाइलों को केवल .a फ़ाइल से बाहर खींच लिया जाता है, यदि उनमें एक प्रतीक संदर्भित किया जाता है। ए .o फ़ाइल हमेशा से जुड़ा हुआ है, संदर्भित है या नहीं। –

+0

ठीक है, मेरी स्थिति के विनिर्देशों को अनदेखा कर रहा है: क्या एक स्थिर लाइब्रेरी को साझा किए गए एक में परिवर्तित करने का कोई तरीका नहीं है * जैसे कि * .o' फ़ाइलों का उपयोग किया गया था? ('ar -x' को छूट) –