Wednesday, 15 February 2012

How do you handle headers that include headers with a makefile in C? -


मान लीजिए आपके पास file.c फ़ाइल नाम है।

  • file.c इसमें header1.h
  • header1.h शामिल है header2.h

    यहाँ मेकफ़ाइल के लिए मेरे पास है:

      file.x: file.o -gcc file.o -o file.x file.o: file.c header1.h header2 .h -gcc file.c header1.h header2.h   

    मैं हेडर 2 एच में हैडर 1.h को शामिल करने के तरीके के बारे में उलझन में हूं।

    क्या यह लाइन बेमानी है? या निर्भरता दिखाने के लिए क्या यह अच्छी शैली है?

      file.c header1.h header2.h   

    अपडेट: मैं माफी चाहता हूं भ्रम के लिए मैंने इस सवाल पर किए गए संपादन में बदलाव किया है वर्तमान मेसोफाइल एक है जिसे मैंने मूल प्रश्न में पोस्ट किया है जोनाथन का उत्तर संदर्भित करता है।

    मूल संस्करण प्रश्न का निम्न कोड makefile में होता है:

      file.o: file.c header1.h header2.h -gcc file.c header1.h header2 .h   

    मेरा जवाब प्रश्न के मूल संस्करण को संबोधित करता है, इसे तय करने से पहले।

    ध्यान दें कि संकलन लाइन निष्पादन योग्य A.out जब तक हेडर फाइल संकलित करने के लिए कंपाइलर ऑब्जेक्ट न हो आपको कमांड लाइन में -c होना चाहिए।


    कुछ समस्याएं:

    1. इन में एक मेसेफाइल , जब ऑब्जेक्ट फ़ाइल को पुनर्निर्माण की आवश्यकता होती है?

      उत्तरः जब सोर्स फाइल या हेडर में से एक में बदलाव शामिल हैं।

      सहायक प्रश्न: इस निर्भरता रेखा का क्या मतलब है:

        file.o: file.c header1.h header2.h   

      सहायक ए: file.o

    2. यदि आप निर्धारित करते हैं: header1.h पर निर्भर करता है कोड> हैडर 2.h , header1.h को होने वाला क्या है जब आप header2.h बदलते हैं?

      उत्तर: कुछ भी नहीं। आप header1.h प्रति से संकलित नहीं करते हैं। यह ऑब्जेक्ट फाइल है जो बदल जाती है।

    3. यदि आप file.c को निर्धारित करते हैं तो header1.h पर निर्भर करता है < कोड> हैडर 2.h या दोनों, जब आप किसी एक हेडर को बदलते हैं, तो file.c को क्या होने वाला है?

      उत्तर: फिर से कुछ नहीं। आप file.c को बदल नहीं सकते; आप ऑब्जेक्ट फ़ाइल फिर से कंपाइल कर सकते हैं।

      इसलिए, अपने ऑब्जेक्ट फ़ाइल नियम का निर्भरता भाग ठीक है (स्वचालित निर्भरता पीढ़ी से संबंधित सीमाओं के भीतर) नियम में कोई बात नहीं है जो कहती है कि स्रोत फ़ाइल हेडर पर निर्भर करती है; वास्तव में, स्रोत फ़ाइल सीधे हेडर पर निर्भर नहीं करती है (यह अप्रत्यक्ष रूप से उन पर निर्भर करता है, यदि शीर्ष लेख सामग्री बदल जाती है ताकि वैध कोड क्या मान्य हो, अब तक कोई मान्य कोड नहीं होगा, स्रोत तय होने तक कुछ भी संकलित नहीं होगा।) लेकिन यह विषय से थोड़ी दूर है।)

      हार्ड-कोडिंग निर्भरता समस्याग्रस्त है; वह बदल गए। दूसरी ओर, निर्भरता स्वचालित रूप से उत्पन्न करने के लिए fiddly है जीसीसी विकल्प हैं (जैसे -M , -MM , -MF , -MG , - MP , -MQ , -MD , -MMD , -MT , - एच â â â? ) अगर वे नहीं करते हैं ये मदद कर सकते हैं स्वत: निर्भरता पीढ़ी को अनदेखा करने के लिए मैकडॉन्ड , mkdep और उससे संबंधित कमांड देखें।


      स्वत: निर्भरता पीढ़ी की उपेक्षा करना, आपका मेकअप फ़ाइल शायद पढ़ा: < / P>

        FILES.o = file.o file.x: $ {FILES.o} $ {CC} -o $ @ $ {CFLAGS} $ {FILES.o} file.o: फ़ाइल। C header1.h header2.h   

      बना को file.c में file.o < / Code>।

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

        एलडीएफएएलजीएस = -एल / ​​यूएसआर / लोकल / लिब एलडीआईएलबीएस = -लोकल फाइलें.ओ = फाइल। अन्य 1.ओ Other2.o file.x: $ {FILES.o} $ {CC} -o $ @ $ {CFLAGS} $ {FILES.o} $ {एलडीएफएएलजीएस} $ {एलडीआईएलबीएस} file.o: file.c header1.h header2 .h   

      ध्यान दें कि ऑब्जेक्ट फ़ाइलों के बाद पुस्तकालयों को जाना चाहिए। ऑब्जेक्ट फाइलों से पहले पुस्तकालयों को सूचीबद्ध करना अन्य प्लेटफार्मों पर लिंक-टाइम असफलताओं का नेतृत्व करने के लिए उपयुक्त है, जो आपके सॉफ़्टवेयर के निर्माण की कोशिश कर रहे हैं।

No comments:

Post a Comment