2011-10-28 14 views
14

में मैं कुछ साझा वस्तुओं का संकलन कर रहा हूँ एक archive.a में दायर:लिंक करना अभिलेखागार (ए) साझा वस्तु (.so)

$ g++ -c -Iinclude/ -fPIC -O0 -o object1.o source1.cpp 
$ g++ -c -Iinclude/ -fPIC -O0 -o object2.o source2.cpp 
$ ar rvs archive.a object1.o object2.o 
r - object1.o 
r - object2.o 

अब तक तो अच्छा। परिणामी archive.a में कुछ केबी का अच्छा आकार है। nm के साथ एक डंप दिखाता है कि संबंधित ऑब्जेक्ट-फ़ाइलें फ़ाइलों के भीतर निहित हैं।

अब मैं इन संग्रहों में से कई को साझा ऑब्जेक्ट फ़ाइल में संकलित करना चाहता हूं।

$ nm -D libLibrary.so 
       w _Jv_RegisterClasses 
0000000000201010 A __bss_start 
       w __cxa_finalize 
       w __gmon_start__ 
0000000000201010 A _edata 
0000000000201020 A _end 
0000000000000578 T _fini 
0000000000000430 T _init 

किसी भी विचार मैं गलत क्या कर रही हूं:

g++ -g -O0 -Iinclude/ -I/usr/include/somelibrary -shared -o libLibrary.so archive1.a archive2.a 

नतीजा यह है कि मेरी जिसके परिणामस्वरूप पुस्तकालय फ़ाइल लगभग खाली है?


संपादित करें:

जब मैं स्विच -Wl,--whole-archive कोशिश है, तो निम्न होता है:

/usr/lib/x86_64-linux-gnu/libc_nonshared.a(elf-init.oS): In function `__libc_csu_init': 
(.text+0xd): undefined reference to `__init_array_end' 
/usr/bin/ld: /usr/lib/x86_64-linux-gnu/libc_nonshared.a(elf-init.oS): relocation R_X86_64_PC32 against undefined hidden symbol `__init_array_end' can not be used when making a shared object 
/usr/bin/ld: final link failed: Bad value 
collect2: ld returned 1 exit status 
make: *** [libKeynect.so] Error 1 
+0

संभावित डुप्लिकेट [साझा वस्तु में किसी संग्रह की सभी वस्तुओं को कैसे शामिल करें?] (Http://stackoverflow.com/questions/2763988/how-to-include-all-objects-of-an-archive- इन-ए-साझा-ऑब्जेक्ट) – Atmocreations

उत्तर

15

प्रतीकों/ए फ़ाइलों को उपयोग नहीं किया जाता में वस्तु फ़ाइलें, लिंकर द्वारा छोड़ दिए जाएंगे ।

उपयोग -Wl,--whole-archive जोड़ने पूरे .a फ़ाइल संपादित करें शामिल करने के लिए, आप -Wl,--no-whole-archive जोड़ने के लिए आपको अपनी लाइब्रेरी में भी निर्दिष्ट के बाद, इसलिए आवश्यकता होगी पूरी बात -Wl,--whole-archive archive1.a archive2.a -Wl,--no-whole-archive

+0

आपके तेज़ उत्तर के लिए धन्यवाद। दुर्भाग्य से, मुझे एक और समस्या में भागना प्रतीत होता है। मैंने सवाल संशोधित किया। – Atmocreations

4

हो जाएगा अपने संपादित के बारे में: रखो आपके द्वारा चलाए जा रहे लिंक कमांड के अंत में "-ब्लूएल, - नो-ऑल-आर्काइव"। उसने मेरे लिए इसे हल कर दिया।

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