हमारी परियोजना को संकलित करते समय, हम कई संग्रह (स्थिर पुस्तकालय) बनाते हैं, 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
कोई विचार कहां से आता है?
धन्यवाद, ऐसा लगता है कि मैं क्या देख रहा हूं, लेकिन यह एक लिंक त्रुटि उत्पन्न करता है जिसे मैं नहीं समझ सकता कि यह कहां से आता है। मैंने सवाल में विवरण जोड़ा। –
इस विकल्प के लिए 'man ld' में importnat नोट है: अभिलेखागार की अपनी सूची के बाद -Wl, -no-whole-archive का उपयोग करना न भूलें, क्योंकि जीसीसी आपके लिंक पर अभिलेखागार की अपनी सूची जोड़ देगा और आप नहीं कर सकते यह ध्वज उन लोगों को भी प्रभावित करना चाहते हैं –