2010-05-04 8 views
13

हमारी परियोजना को संकलित करते समय, हम कई संग्रह (स्थिर पुस्तकालय) बनाते हैं, liby.a और libz.a कहते हैं कि प्रत्येक में एक फ़ंक्शन y_function() और z_function() परिभाषित करने वाली ऑब्जेक्ट फ़ाइल होती है। फिर, ये संग्रह एक साझा वस्तु में शामिल हो गए हैं, libyz.so कहें, यह हमारे मुख्य वितरित लक्ष्य में से एक है।किसी साझा ऑब्जेक्ट में किसी संग्रह की सभी ऑब्जेक्ट्स को कैसे शामिल करें?

g++ -fPIC -c -o y.o y.cpp 
ar cr liby.a y.o 
g++ -fPIC -c -o z.o z.cpp 
ar cr libz.a z.o 
g++ -shared -L. -ly -lz -o libyz.so 

उदाहरण कार्यक्रम में इस साझा वस्तु का उपयोग कर, कहते हैं कि x.c, लिंक क्योंकि कार्यों y_function() और z_function() के लिए एक अपरिभाषित संदर्भ के विफल रहता है।

g++ x.o -L. -lyz -o xyz 

हालांकि यह काम करता है जब मैं अभिलेखागार (स्थिर पुस्तकालयों) के साथ सीधे अंतिम निष्पादन योग्य लिंक।

g++ x.o -L. -ly -lz -o xyz 

मेरा अनुमान है कि वस्तु अभिलेखागार में निहित फ़ाइलें नहीं साझा लाइब्रेरी में जुड़ा हुआ क्योंकि वे इसे में इस्तेमाल नहीं कर रहे हैं कर रहे हैं। समावेश को कैसे मजबूर करें?

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

समावेशन --whole-संग्रह का उपयोग कर ld विकल्प के लिए मजबूर हो सकता है। लेकिन यदि संकलन त्रुटियों में परिणाम:

g++ -shared '-Wl,--whole-archive' -L. -ly -lz -o libyz.so 
/usr/lib/libc_nonshared.a(elf-init.oS): In function `__libc_csu_init': 
(.text+0x1d): undefined reference to `__init_array_end' 
/usr/bin/ld: /usr/lib/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 

कोई विचार कहां से आता है?

उत्तर

18

आप की कोशिश कर सकते (ld (2)):

--whole-archive 
     For each archive mentioned on the command line after the --whole-archive option, include every object file in the 
     archive in the link, rather than searching the archive for the required object files. This is normally used to turn 
     an archive file into a shared library, forcing every object to be included in the resulting shared library. This 
     option may be used more than once. 

(जीसीसी -Wl, - पूरे संग्रह)

इसके अलावा, आप -Wl,--no-whole-archive पुस्तकालय सूची के अंत में रखना चाहिए। (जैसा कि नीचे टिप्पणी में दिमित्री युडाकोव ने कहा था)

+0

धन्यवाद, ऐसा लगता है कि मैं क्या देख रहा हूं, लेकिन यह एक लिंक त्रुटि उत्पन्न करता है जिसे मैं नहीं समझ सकता कि यह कहां से आता है। मैंने सवाल में विवरण जोड़ा। –

+2

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

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