जिस तरह से मेरी टीम की परियोजना विकसित की गई है, हम अपने सभी .o
ऑब्जेक्ट फ़ाइलों से हमारे आवेदन के लिए साझा ऑब्जेक्ट लाइब्रेरी उत्पन्न करते हैं। मेरा काम (उम्मीद है कि यह पर्याप्त विशिष्ट है लेकिन दूसरों के लिए उपयोग करने के लिए भी सामान्य है!) केवल ऑब्जेक्ट फाइलों में लिंक करना है जो निष्पादन योग्य बनाया गया था। उदाहरण के लिए, यहां कमांड लाइन है जिसका उपयोग मैं .so:लिनक्स पर जीसीसी का उपयोग करके वृद्धिशील लिंकिंग। क्या यह संभव है?
g++34 -shared -rdynamic -m64 -Wl,-rpath,'$ORIGIN' MyObject1.o MyObject2.o MyObject3.o MyObject4.o -o libMySharedLibrary.so
जो अपेक्षा के अनुसार काम करता है! :) मेरा लक्ष्य समवर्ती लिंकिंग प्रक्रिया को तेज करने के लिए, अब से केवल बदली गई ऑब्जेक्ट फ़ाइलों में लिंक करने में सक्षम होना है। एक उदाहरण कमांड यह होगी:
g++34 -shared -rdynamic -m64 -Wl,-rpath,'$ORIGIN' MyObject1.o MyObject3.o -o libMySharedLibrary.so
कौन सा नया वस्तु फाइलों के साथ libMySharedLibrary.so
अद्यतन होता है, जबकि यह भी libMySharedLibrary.so
में बड़े वस्तु फ़ाइलों को बनाए रखने। वास्तविकता में, जब मैं उपरोक्त आदेश का उपयोग करके libMySharedLibrary.so
उत्पन्न करता हूं, तो फ़ाइल-आकार उस ऑब्जेक्ट की तुलना में बहुत छोटा होता है जब सभी ऑब्जेक्ट फ़ाइलों को शामिल किया जाता है, इसलिए मैं लगभग सुनिश्चित कर सकता हूं कि उपरोक्त आदेश वह नहीं कर रहा है जो मैं चाहता हूं।
मेरे शोध के माध्यम से मैंने पाया है कि -i
विकल्प है जो -r
विकल्प जैसा है, जो कि सभी ऑब्जेक्ट फ़ाइलों को एक बड़ी ऑब्जेक्ट फ़ाइल में भी जोड़ता है। दुर्भाग्यवश ऐसा नहीं लगता है कि यह वही है जो मैं चाहता हूं।
संक्षेप में, मैं प्रारंभिक लिंक के बाद केवल बदली गई ऑब्जेक्ट फ़ाइलों में लिंक करना चाहता हूं, जिसके परिणामस्वरूप भविष्य के लिंक के लिए त्वरित लिंकिंग प्रक्रिया होती है। क्या इसे करने का कोई तरीका है?
संपादित करें: क्या मैं -i/-r
साथ की कोशिश की है का एक उदाहरण:
उदाहरण आदेश: g++34 -Wl,-r -nostdlib -rdynamic -m64 -Wl,-rpath,'$ORIGIN' MyObject1.o MyObject2.o MyObject3.o MyObject4.o -o AllMyObjects.o
मैं इसे की आवश्यकता होगी, के बारे में मुझ पर चिल्ला से रोकने के लिए -nostdlib
टैग को जोड़ने के लिए किया था, और हटा दिया -shared
क्योंकि -r
टैग के साथ साझा वस्तुओं की अनुमति नहीं है।
यह आदेश मेरी सभी .o फ़ाइलों को एक बड़ी .o फ़ाइल में स्लैम करने के लिए प्रतीत होता है। तो अगर मैं सिर्फ उस .o फाइल को केवल बदली गई .o फाइलों के साथ अपडेट कर सकता हूं, तो यह बहुत अच्छा होगा। AllMyObjects.o प्रारंभ में बनाया गया था, मैंने इस कमांड को आजमाया: g++34 -Wl,-r -nostdlib -rdynamic -m64 -Wl,-rpath,'$ORIGIN' MyObject1.o MyObject3.o -o AllMyObjects.o
, लेकिन यह बहुत छोटा (फ़ाइल-आकार-वार) AllMyObjects.o
भी बनाएगा, इसलिए मुझे लगता है कि यह संभवतः सभी ऑब्जेक्ट फ़ाइलों को नहीं रख सकता है। मुझे ऐसा लगता है कि यह ऐसा कुछ है जिस पर मैं एक छोटी सी गलती कर रहा हूं। किसी के पास कोई सलाह है? अग्रिम में धन्यवाद।
क्या लिंक चरण वास्तव में आपके वृद्धिशील बिल्डों पर हावी है? यदि नहीं, तो परेशान क्यों? – dmckee
क्या आप हमें दिखा सकते हैं कि आपने '-i'/'-r' के साथ क्या प्रयास किया है? ऐसा लगता है कि यह * वह विकल्प है जिसे आप चाहते हैं, हालांकि मुझे उम्मीद है कि आप प्रतीक संघर्ष में भाग लेंगे (क्योंकि वहां कोई 'प्रतिस्थापन' विकल्प नहीं है)। –
लिंक चरण मेरे निर्माण का सबसे अधिक समय लेने वाला हिस्सा नहीं है। हालांकि, यह वह कार्य है जिसे मेरी टीम के नेता ने मुझे दिया है। जो कुछ बदल गया है उसे संकलित करने पर हम पहले से ही अच्छे हैं। वर्तमान में, हम केवल तभी संकलित करते हैं, जो हर बार ऑब्जेक्ट फ़ाइल को रिलिकिंक करते समय बदल जाता है। –