2013-01-13 16 views
7

के बीच ऑब्जेक्ट फ़ाइल संगतता पहले मैं रिकॉर्ड के लिए यह कहना चाहता हूं कि यह प्रश्न स्कूल/होमवर्क से संबंधित है।सी कंप्यूटर

मान लें कि कंप्यूटर सीपी 1 और सीपी 2 दोनों एक ही ऑपरेटिंग सिस्टम और मशीन भाषा साझा करते हैं। यदि सीपी 1 पर सी सी प्रोग्राम संकलित किया गया है, तो उसे सीपी 2 में स्थानांतरित करने के लिए, स्रोत कोड को स्थानांतरित करना और सीपी 2 पर पुन: संकलित करना आवश्यक है, या बस ऑब्जेक्ट फ़ाइलों को स्थानांतरित करना आवश्यक है।

मेरा आंत जवाब यह है कि ऑब्जेक्ट फ़ाइलों को पर्याप्त होना चाहिए। सी कोड को कंपाइलर द्वारा असेंबली में अनुवादित किया जाता है और असेंबलर द्वारा मशीन कोड में इकट्ठा किया जाता है। चूंकि आर्किटेक्चर एक ही मशीन कोड और ऑपरेटिंग सिस्टम साझा करता है, मुझे कोई समस्या नहीं दिखाई देती है।

लेकिन जितना अधिक मैं इसके बारे में सोचता हूं, उतना ही भ्रमित मैं प्राप्त करना शुरू कर रहा हूं।

मेरे प्रश्न हैं:

क) अपनी फ़ाइलों और नहीं निष्पादनयोग्य आपत्ति की बात के बाद से, मैं वहाँ संभालने कर रहा हूँ कोई जोड़ने की गई है। क्या सीपी 2 पर लिंक करते समय सतह की कोई समस्या होगी?

बी) क्या इससे कोई फर्क नहीं पड़ता कि कोड सीपी 1 पर सी 11 मानक का उपयोग करता है लेकिन सीपी 2 पर एकमात्र कंपाइलर सी 99 था? मुझे लगता है कि कोड संकलित/इकट्ठा होने के बाद यह अप्रासंगिक है।

सी) प्रश्न साझा/गतिशील लिंक्ड पुस्तकालयों को निर्दिष्ट नहीं करता है। तो यह केवल वास्तव में काम करेगा यदि प्रोग्राम की .dll/.so/.dylib फ़ाइलों पर कोई निर्भरता नहीं थी, अन्यथा इन्हें सीपी 2 पर भी आवश्यक होगा।

मुझे लगता है कि बहुत सारे गॉथस हैं, और इस बात पर विचार करते हुए कि सवाल कितना अस्पष्ट है, अब मुझे लगता है कि यह बस पुनः संयोजित करना सुरक्षित होगा।

हल्प!

+0

distcc, जो कंप्यूटर के बीच ऑब्जेक्ट फ़ाइलों की प्रतिलिपि बनाता है, सी भाषा के लिए भी सभी नोड्स पर कंपाइलर के समान संस्करण का उपयोग करने की सिफारिश करता है। – aschepler

उत्तर

3

उत्तर है, यह निर्भर करता है। जब आप एक सी प्रोग्राम संकलित करते हैं और ऑब्जेक्ट फ़ाइलों को किसी भिन्न कंप्यूटर पर लिंक करने के लिए स्थानांतरित करते हैं, तो इसे काम करना चाहिए। लेकिन endianness या name mangling जैसे कारकों की वजह से, आपका प्रोग्राम इरादे से काम नहीं कर सकता है, और जब भी आप इसे चलाने का प्रयास करते हैं तो क्रैश भी हो सकता है।

C11C99 कंपाइलर द्वारा समर्थित नहीं है, लेकिन इससे कोई फर्क नहीं पड़ता कि स्रोत संकलित और एकत्रित किया गया है या नहीं।

जब तक स्रोत एक मशीन पर पुस्तकालयों के साथ संकलित किया गया है, जिसे आप लिंक या अन्य कंप्यूटर पर फ़ाइल (रों) चलाने के लिए पुस्तकालयों की जरूरत नहीं है (स्थिर पुस्तकालयों केवल, गतिशील पुस्तकालयों करना होगा उस कंप्यूटर पर रहें जिस पर आप एप्लिकेशन चलाते हैं)। इसने कहा, आपको प्रोग्राम को स्वतंत्र बनाना चाहिए ताकि आप उसी समस्या में भाग न सकें जहां पहले प्रोग्राम इरादे या दुर्घटनाओं के रूप में काम नहीं करता है।

आप एक संकलक प्राप्त कर सकते हैं जो EABI का समर्थन करता है ताकि आप इन समस्याओं में भाग न सकें। ऐसे कंपाइलर्स जो EABI को ऑब्जेक्ट कोड बनाते हैं जो अन्य ऐसे कंपाइलर्स द्वारा उत्पन्न कोड के साथ संगत है, इस प्रकार डेवलपर्स को एक कंपाइलर के साथ जेनरेट की गई लाइब्रेरी को एक अलग कंपाइलर के साथ उत्पन्न ऑब्जेक्ट कोड के साथ जोड़ने की अनुमति देता है।

मैंने पहले ऐसा करने की कोशिश की है, लेकिन पूरी तरह से नहीं, और हाल ही में नहीं। इसलिए, मेरी जानकारी 100% सटीक नहीं हो सकती है।

+0

"आपको पुस्तकालयों की आवश्यकता नहीं है" - यह केवल स्थिर लिंकिंग के लिए सच है। डायनामिक libs केवल आपके प्रोग्राम द्वारा संदर्भित हैं, इसमें संकलित नहीं है। अगर वे गायब हैं तो कार्यक्रम शुरू नहीं होगा। –

+0

इसे पकड़ने के लिए धन्यवाद, संपादित करें। – syb0rg

+0

आपका rev 2 काफी सही है, आपको नाम मैंगलिंग और रनटाइम संगतता का जिक्र करना चाहिए, ऐसे सिस्टम हैं जहां आप वास्तव में विभिन्न प्रकार के ऑब्जेक्ट फ़ाइल आउटपुट के लिए पूछ सकते हैं, जब एक नया [एबीआई] (http://en.wikipedia.org/wiki/application_binary_interface) इतना बेहतर है कि इसे प्राप्त करने के लिए टूलचेन को फिर से लिखना उचित है। – jthill

1

ए) मैंने पहले से ही "ऑब्जेक्ट फाइल" शब्द को लिंक किए गए बाइनरी के संदर्भ में उपयोग किया है - भले ही यह थोड़े गलत है। तो शायद उनका मतलब "द्विआधारी" है।मैं कहूंगा कि एक अलग मशीन पर लिंक करना समस्याग्रस्त हो सकता है यदि उसके पास एक अलग कंपाइलर है - जब तक ऑब्जेक्ट फ़ाइल स्वरूप मानकीकृत नहीं होते हैं, जो मुझे यकीन नहीं है।

बी) विभिन्न मानकों या यहां तक ​​कि कंपाइलरों का उपयोग बाइनरी कोड के लिए कोई फर्क नहीं पड़ता - अगर यह स्थिर रूप से जुड़ा हुआ है। यदि यह गतिशील lib से फ़ंक्शंस पर निर्भर करता है, तो समस्याएं हो सकती हैं। कौन सी जवाब सी) साथ ही: हाँ, यह एक समस्या होगी। कार्यक्रम शुरू नहीं होगा यदि इसमें सही संस्करण में सभी आवश्यक गतिशील libs नहीं हैं। लिंकिंग मोड (स्थिर बनाम गतिशील) पर निर्भर करता है, फिर से।

0

प्रश्न: मान लें कि कंप्यूटर सीपी 1 और सीपी 2 दोनों एक ही ऑपरेटिंग सिस्टम और मशीन भाषा साझा करते हैं।

एक: तो फिर तुम एक ही .exe के

क्यू चला सकते हैं दोनों कंप्यूटरों पर: एक सी प्रोग्राम CP1 पर संकलित किया गया है, तो कृपया यह CP2 को ले जाने के लिए, यह आवश्यक स्रोत कोड

हस्तांतरण करने के लिए है

ए: नहीं। अगर आप पुन: संकलित करना चाहते हैं तो आपको केवल स्रोत कोड की आवश्यकता है। यदि आप एक अलग, असंगत CPU और/या ओएस हैं तो आपको केवल पुन: संकलित करने की आवश्यकता है।

"ऑब्जेक्ट फ़ाइलें" आम तौर पर बिल्कुल प्रोग्राम निष्पादन के लिए आवश्यक नहीं हैं:

http://en.wikipedia.org/wiki/Object_files

एक वस्तु फ़ाइल पुनर्निधारणीय प्रारूप मशीन कोड आमतौर पर सीधे निष्पादन योग्य नहीं है कि वाली फ़ाइल है। ऑब्जेक्ट फ़ाइलों को द्वारा एक असेंबलर, कंपाइलर, या अन्य भाषा अनुवादक द्वारा उत्पादित किया जाता है, और लिंकर को इनपुट के रूप में उपयोग किया जाता है।

एक "निष्पादन योग्य प्रोग्राम" को एक या अधिक "साझा पुस्तकालय" (उर्फ। डीएलएस) की आवश्यकता हो सकती है। इस मामले में एक ही प्रतिबंध लागू होते हैं: साझा पुस्तकालय, यदि पहले से ही निवासी नहीं हैं, तो .exe के साथ प्रतिलिपि बनाई जानी चाहिए, और सीपीयू और ओएस के साथ भी संगत होना चाहिए।

अंत में, "स्क्रिप्ट" को पुन: संकलित करने की आवश्यकता नहीं है। आप स्क्रिप्ट को कंप्यूटर से कंप्यूटर पर स्वतंत्र रूप से कॉपी कर सकते हैं। लेकिन प्रत्येक कंप्यूटर में स्क्रिप्ट चलाने के लिए "दुभाषिया" होना चाहिए: एक पर्ल स्क्रिप्ट को पर्ल दुभाषिया, एक पाइथन लिपि एक पायथन दुभाषिया की आवश्यकता होती है, और इसी तरह।

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