2012-09-22 28 views
5

मैं Visual Studio 2012 C++/CLI साथ याक और लेक्स उपयोग कर रहा हूँ और नीचे के रूप मेंविज़ुअल स्टूडियो 2012 कस्टम बिल्ड चरण क्यों चल रहा है जब स्रोत फ़ाइल नहीं बदला गया है?

Custom Build Property Page

छवि में दिखाया गया आउटपुट फ़ाइल के लिए दो निर्भरता हैं याक स्रोत फ़ाइल के लिए एक कस्टम निर्माण कदम बनाया है । वे yacc स्रोत फ़ाइल icl5kyacc.y और yyparse.c टेम्पलेट फ़ाइल हैं। हर बार जब मैं समाधान का निर्माण करता हूं तो कस्टम बिल्ड चरण तब भी चलता है जब yyparse.c और icl5kyacc.y स्रोत फ़ाइलों को संशोधित नहीं किया गया है। निर्माण के बाद निर्देशिका सूची यहां दी गई है।

21-Sep-2012 10:19:18p   28,210 A icl5kyacc.y 
    17-Sep-2012 7:32:06p   9,042 A yyparse.c 
    22-Sep-2012 11:43:56a   38,233 A ICL5KYACC.cpp 
    22-Sep-2012 11:43:56a   2,160 A icl5kyacc.h 

और फिर

2> से icl5kyacc.y

21-Sep-2012 10:19:18p   28,210 A icl5kyacc.y 
    17-Sep-2012 7:32:06p   9,042 A yyparse.c 
    22-Sep-2012 11:45:46a   38,233 A ICL5KYACC.cpp 
    22-Sep-2012 11:45:46a   2,160 A icl5kyacc.h 

हूँ मैं विश्वास है कि एक कस्टम निर्माण कदम का उपयोग कर अपने आप मानक निर्भरता नियम लागू करना चाहिए में गलत निर्माण icl5kyacc.cpp जनरेट कर रहा है के बाद निर्माण चरण के इनपुट और आउटपुट फाइलों के बीच? एक बात जो मैं उत्सुक हूं, % (अतिरिक्त इनपुट) मैक्रो जो स्टूडियो अतिरिक्त निर्भरताओं के तहत मेरे लिए रखती है। यह सुनिश्चित नहीं है कि वह क्या है या यदि यह किसी भी तरह से उस फ़ाइल को इंगित करता है जिसे संशोधित किया जा रहा है।

+0

**% (अतिरिक्त इनपुट) ** मैक्रो को हटाने से इस मुद्दे पर कोई प्रभाव नहीं पड़ा। – JonN

उत्तर

3

समस्या यह थी कि% (निर्देशिका) प्रोजेक्ट निर्देशिका "आईसीएल 5 के \ आईसीएल 5 के \" के समाधान के माता-पिता से एक सापेक्ष पथ था और निर्माण के दौरान वर्तमान निर्देशिका पहले ही प्रोजेक्ट निर्देशिका है। तो yyparse.c आश्रित सी: \ ICL5K \ ICL5K \ ICL5K \ ICL5K में देखा जा रहा था। मुझे $ (ProjectDir) का उपयोग करना चाहिए जो रूट विनिर्देशक "सी: \ आईसीएल 5 के \ आईसीएल 5 के \" सहित रूट से एक पूर्ण पथ है। लेकिन यह भी बेहतर था कि सभी इनपुट और आउटपुट फाइल प्रोजेक्ट निर्देशिका में थीं और यह पहले से ही वर्तमान डिफ़ॉल्ट निर्देशिका थी और image here नीचे दिखाए गए सभी निर्देशिका मैक्रोज़ को हटाने के लिए भी icl5kyacc.y को निर्दिष्ट करना आवश्यक नहीं है आश्रित कस्टम बिल्ड चरण icl5kyacc.y की एक संपत्ति है, इसलिए फ़ाइल को पहले से ही एक आश्रित के रूप में शामिल किया गया है।

3

क्या आप वाकई सुनिश्चित करते हैं कि आपकी आउटपुट फ़ाइलें वास्तव में स्थित हैं जहां आप निर्दिष्ट करते हैं?

आपकी लिस्टिंग को देखते हुए आपके पास %(Directory)yyparse.c पर सूचीबद्ध इनपुट है (इसमें भी .y फ़ाइल भी शामिल होनी चाहिए)। क्या आपका आउटपुट %(Directory)icl5kyacc.h और %(Directory)ICL5KYACC.cpp में भी नहीं होना चाहिए, यह देखते हुए कि आपकी लिस्टिंग इंगित करती है कि वे एक ही निर्देशिका में जाते हैं।

निर्माण कार्य तब नहीं होगा जब आउटपुट फाइलें नहीं मिल पाती हैं या आउटपुट फाइल इनपुट फ़ाइलों से पुरानी हैं। यदि आपका पथ आउटपुट फ़ाइलों में गलत है तो टूल उन्हें नहीं ढूंढ पाएगा और मान लें कि बिल्ड कार्य को फिर से चलाने की आवश्यकता है।

+0

आपका उत्तर समाधान के लिए पूरी तरह सही नहीं होने पर आपका उत्तर। मैंने सोचा कि% (निर्देशिका) रूट से परियोजना निर्देशिका में पूर्ण पथ था जो निर्माण के दौरान वर्तमान निर्देशिका भी है। % (निर्देशिका) प्रोजेक्ट निर्देशिका को इंगित करता है लेकिन ड्राइव या अग्रणी स्लैश "आईसीएल 5 के \ आईसीएल 5 के \" के बिना जो बहुत उपयोगी नहीं है क्योंकि यह समाधान के माता-पिता से एक सापेक्ष पथ है। मैं जो चाहता था वह $ (प्रोजेक्टडियर) था जो "सी: \ आईसीएल 5 के \ आईसीएल 5 के \" है। हालांकि मुझे एक आसान समाधान मिला था सभी% (निर्देशिका) मैक्रोज़ को हटाने के लिए क्योंकि सभी फाइलें प्रोजेक्ट निर्देशिका में हैं और यह पहले से ही वर्तमान निर्देशिका है। – JonN