2009-06-08 8 views
12

हाल ही में मैं वीसी ++ 6.0 में लिखित एक विरासत परियोजना को बनाए रख रहा हूं। कोड इस कंपाइलर की इतनी अनूठी विशेषताओं का उपयोग करता है जो इसे एक और हालिया मानक कंपाइलर को पोर्ट करना एक कठिन कार्य साबित हुआ है।ओएमएफ और सीओएफएफ प्रारूप के बीच क्या अंतर है?

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

चेतावनी LNK4033: Coff

को OMF से वस्तु प्रारूप परिवर्तित करने

पुस्तकालय काम करता है के रूप में उम्मीद है, लेकिन मैं सोच रहा है कि इन द्विआधारी के बीच मतभेद है प्रारूप, या अगर मुझे इस रूपांतरण से कुछ बदसूरत उम्मीद करनी चाहिए।

+1

http://www.iecc.com/linker/linker03.html पर एक नज़र डालें। – avakar

+0

@avakar: उस लिंक को उचित उत्तर में क्यों न डालें? – xtofl

उत्तर

14

उत्तर से बाहर nicked "MetaWINDOW पूछे जाने वाले प्रश्न - OMF बनाम Coff वस्तु फ़ाइल Formats.htm"

पीसी सभ्यता ऊपर की सुबह समय के बारे में जब तक के बाद से माइक्रोसॉफ्ट Win32 प्रोग्रामिंग उपकरणों के साथ, आया लगभग सभी पीसी compilers उत्पादित वस्तु फ़ाइलों इंटेल ऑब्जेक्ट मॉड्यूल प्रारूप (ओएमएफ) मानक का उपयोग कर। बाद में, इंटेल ने 386 प्रोसेसर और 32-बिट संरक्षित मोड पेश किए, जिस बिंदु पर उन्होंने 32-बिट्स के लिए ओएमएफ विनिर्देश का विस्तार किया, जिससे "ओएमएफ -386" हो गया जो अधिकांश पीसी संरक्षित-मोड वातावरण के लिए मानक बन गया। लगभग उसी समय, मूल विंडोज एनटी विकास टीम न केवल इंटेल प्रोसेसर के लिए कोड डिजाइन कर रही थी, बल्कि अन्य विक्रेताओं के प्रोसेसर का समर्थन करने के लिए भी। माइक्रोसॉफ्ट एनटी टीम ने यूनिक्स सिस्टम वी। सीओएफएफ ऑब्जेक्ट मॉड्यूल के लिए आधिकारिक ऑब्जेक्ट-कोड प्रारूप से व्युत्पन्न कॉमन ऑब्जेक्ट फ़ाइल प्रारूप (सीओएफएफ) के रूप में जाना जाने वाला एक और पोर्टेबल ऑब्जेक्ट मॉड्यूल प्रारूप चुना है, जो बाद में सभी माइक्रोसॉफ्ट विन 32 विकास उपकरण के लिए डिफैक्टो मानक बन गया, और प्राप्त किया पोर्टेबल निष्पादन योग्य फ़ाइलों के प्रारूप में बहुत करीब होने का लाभ - Win32 के लिए देशी निष्पादन योग्य प्रारूप (एक सीओएफएफ-प्रारूप लिंकर के पास ओएमएफ प्रारूप फ़ाइल की तुलना में एक सीओएफएफ फ़ाइल से 32-बिट EXE या DLL बनाने के लिए बहुत कम काम है)।

जैसे ओएमएफ- और सीओएफएफ-प्रारूप ऑब्जेक्ट फाइलें (.obj's) हैं, ओएमएफ और सीओएफएफ प्रारूप लाइब्रेरी फाइलें (.lib) भी हैं। सौभाग्य से, पुस्तकालय, मूल रूप से ऑब्जेक्ट फ़ाइलों का एक संग्रह है, साथ ही कुछ शीर्षलेख जानकारी के साथ जो लिंकर को लाइब्रेरी से किस ऑब्जेक्ट फ़ाइलों का उपयोग करने की अनुमति देता है। चीजों को मुश्किल बनाने के लिए, ओएमएफ और सीओएफएफ दोनों ही फाइल नाम एक्सटेंशन, .obj और .lib का उपयोग करते हैं, दो अलग-अलग प्रकार के ऑब्जेक्ट और लाइब्रेरी फ़ाइल स्वरूपों का संदर्भ देने के लिए (इस वजह से आप फ़ाइल नाम एक्सटेंशन को नहीं देख सकते यह बताने के लिए कि ऑब्जेक्ट मॉड्यूल या लाइब्रेरी फ़ाइल ओएमएफ या सीओएफएफ है)।

विभिन्न कंपाइलर विक्रेताओं से ऑब्जेक्ट फ़ाइलों और लाइब्रेरी फ़ाइलों को मिलाकर समस्या यह है कि कुछ विक्रेता सीओएफएफ का समर्थन करते हैं, अन्य विक्रेता ओएमएफ का उपयोग करते हैं, और कुछ दोनों ही संभाल सकते हैं। उदाहरण के लिए, बोर्लैंड ओएमएफ ऑब्जेक्ट फाइलों और पुस्तकालयों का उपयोग करता है, जबकि माइक्रोसॉफ्ट के 32-बिट कंपाइलर्स सीओएफएफ प्रारूप फाइलें उत्पन्न करते हैं। वाटकॉम सी/सी ++ v11.0 विंडोज अनुप्रयोगों को संकलित और लिंक करते समय सीओएफएफ पसंद करते हैं, लेकिन ओएमएफ ऑब्जेक्ट फाइलों को उनके DOS4GW 32-बिट संरक्षित-मोड डॉस-एक्सेंडर के साथ उपयोग के लिए उत्पन्न करता है। इसके साथ ही, माइक्रोसॉफ्ट एमएएसएम 6.13 डिफ़ॉल्ट रूप से ओएमएफ फाइलें उत्पन्न करता है, लेकिन इसके साथ/कॉफ़ स्विच इसके बजाय सीओएफएफ ऑब्जेक्ट फाइलों को उत्सर्जित कर सकता है।

जब विभिन्न प्रारूपों वाली फ़ाइलों को लिंक करने का समय आता है, तो अलग-अलग लिंकर्स अलग-अलग चीजें करते हैं। उदाहरण के लिए, माइक्रोसॉफ्ट विजुअल सी/सी ++ लिंकर को सीओएफएफ प्रारूप ऑब्जेक्ट फाइलों और पुस्तकालयों के लिए डिज़ाइन किया गया है, लेकिन यदि आवश्यक हो तो ओएमएफ ऑब्जेक्ट फ़ाइलों को सीओएफएफ फाइलों में कनवर्ट करने का प्रयास करेगा। यह कुछ मामलों में काम करता है, लेकिन दुर्भाग्यवश माइक्रोसॉफ्ट लिंक सभी ओएमएफ रिकॉर्ड प्रकारों का समर्थन नहीं करता है, इसलिए कई स्थितियों में लिंकर अभी भी विफल हो सकता है जब ओएमएफ प्रारूप ऑब्जेक्ट फाइलें दी जाती हैं। इसके अलावा, माइक्रोसॉफ्ट लिंक ओएमएफ ऑब्जेक्ट फाइलों के लिए कुछ समर्थन का प्रयास करता है, लेकिन यह किसी भी ओएमएफ प्रारूप पुस्तकालयों को संसाधित करने से इंकार कर देगा।अन्य लिंकर्स, जैसे कि बोर्लैंड के टीLINK, ओएमएफ ऑब्जेक्ट फाइलों के लिए डिज़ाइन किए गए हैं और इसी तरह सीओएफएफ-फॉर्मेट ऑब्जेक्ट या लाइब्रेरी फाइलों के साथ काम करने से इनकार कर देंगे। कुछ डॉस विस्तारक और एम्बेडेड सिस्टम विक्रेता, जैसे कि फ़ैर लैप, अपने स्वयं के लिंकर्स प्रदान करते हैं जो आपको ओएमएफ और सीओएफएफ दोनों का समर्थन करते हैं, जिससे आपको कोई विकल्प मिलते हैं।

नीचे की रेखा यह है कि ओएमएफ और सीओएफएफ ऑब्जेक्ट और लाइब्रेरी फ़ाइल प्रकारों को मिलाकर एक गड़बड़ हो सकती है (साथ ही लिंकर्स से गुप्त त्रुटि संदेश मदद नहीं करते हैं)। जब तक आपका लिंकर विशेष रूप से इसका समर्थन नहीं करता है, आपको अपने कंपाइलर/लिंकर/प्लेटफ़ॉर्म के लिए अनुशंसित ऑब्जेक्ट और लाइब्रेरी प्रारूप के साथ चिपकना चाहिए, और ओएमएफ और सीओएफएफ फ़ाइलों को मिश्रण से बचाना चाहिए।

+0

नीचे की रेखा को लगता है कि _his_ लिंकर रूपांतरण करता है। यह एक त्रुटि उत्पन्न नहीं करता है। – xtofl

+0

लेकिन सभी रूपांतरण आसानी से नहीं जाते हैं। यदि उनकी कोई रनटाइम त्रुटियां या फ़ंक्शन विफलता हैं तो lib libist के भीतर इस lib या obj या obj को देखें। या निश्चित रूप से सभी ठीक हो सकता है। – kingchris

+0

क्या सभी लिंकर्स को विंडोज प्लेटफ़ॉर्म पर चलाने के लिए अंत में एक पीई-सीओएफएफ निष्पादन योग्य बनाना है? लिंकिंग प्रक्रिया के बाद यह अंतिम उत्पादित निष्पादन योग्य डेटा और संरचना को किसी अन्य ऑब्जेक्ट प्रारूप के लिए विशिष्ट बना सकता है। OMF? और यदि हां, तो यह कैसे काम करता है? (या कैसे * कर सकते हैं * वह काम?) – greatwolf

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