2009-05-24 13 views
14

प्रश्न शायद मेरे मुद्दे का वर्णन करने के लिए सबसे अच्छा नहीं है लेकिन मैं बेहतर के बारे में नहीं सोच सकता था। मेरा मेकफ़ाइल इस तरह जाता है:संकलन और चलाने के लिए मेरे मेकफ़ाइल को सही तरीके से कैसे बनाया जाए?

PROGRAM_NAME = prog 

OBJECT_FILES = $(PROGRAM_NAME).o 
CFLAGS = -O2 -Wall -g 

$(PROGRAM_NAME) : $(OBJECT_FILES) 
    gcc $(CFLAGS) -o [email protected] $(OBJECT_FILES) 

$(PROGRAM_NAME).o : $(PROGRAM_NAME).c data.h 
    gcc $(CFLAGS) -c $< 

clean : 
    $(RM) $(PROGRAM_NAME) 
    $(RM) $(OBJECT_FILES) 
    $(RM) *~ *.bak 

run : 
    @$(MAKE) && ./$(PROGRAM_NAME) $(ARGS) 

जब मैं संकलित करना चाहता हूं और चलाता हूं तो मैं बस "रन बनाना" करता हूं। इसके साथ मुद्दा यह है कि मेरा प्रोग्राम Ctrl + Z द्वारा उत्पादित सिग्नल को संभालता है और यदि मैं अपना प्रोग्राम "रन बनाने" के साथ शुरू करता हूं, तो सिग्नल "रन बनाने" के लिए भेजा जाएगा, न कि मेरे प्रोग्राम को।

मूल रूप से, आप को "चलाने के लिए" सीधे कॉल क्योंकि पहले मामले में "& & ./prog बनाने के", "चलाने के लिए" समाप्त नहीं होगा जब तक "prog" पहले समाप्त हो जाता है के रूप में एक ही बात नहीं है।

क्या इसके आसपास कोई रास्ता है?

उत्तर

12

मेकफ़ाइल से चलना थोड़ा असामान्य है। क्या आप शायद "कंपाइल और रन" मेनू आइटम को डुप्लिकेट करने का प्रयास कर रहे हैं जो कुछ आईडीई प्रदान करते हैं? ऐसा करने के लिए अच्छी तरह सुसज्जित नहीं है।

लक्ष्य आदेशों में होने वाली सभी चीजें उप-प्रक्रियाओं में होती हैं जो सीधे टर्मिनल से जुड़ी नहीं होती हैं, यही कारण है कि आपका मुख्य स्ट्रोक प्राप्त होता है।

अन्य बातों को देखने के लिए: आम तौर पर निष्पादन योग्य चरण (लिंकिंग) के लिए ऑब्जेक्ट-फ़ाइल झंडे के एक अलग सेट (LDFLAGS और LIBS) का उपयोग करता है, फिर संकलन चरण। इस सरल उदाहरण में आप इससे दूर हो सकते हैं, लेकिन यदि आप अधिक जटिल मामले में उपयोग के लिए इस मेकफ़ाइल की प्रतिलिपि बनाते हैं तो आप परेशानी में भाग लेंगे।

+0

मैं बेहतर इसका इस्तेमाल नहीं इस तरह से तो ... :) –

3

डीएमकी के जवाब के अनुसार, (1) कुछ बना रहा है, संकलन और चलाने के लिए नहीं।

बेशक

, कुछ भी नहीं एक खोल उर्फ ​​मेकअप रन जो इरादा करता है बनाने के लिए बंद हो जाता है '& & ./prog आर्ग बनाने'।

13

आप यह है कि क्या अपने कार्यक्रम अप टू डेट है पर निर्भर होने से अपने 'रन' लक्ष्य को आसान बनाने में कर सकते हैं, और फिर बस कार्यक्रम चलाने:

run: ${PROGRAM_NAME} 
     ./${PROGRAM} ${ARGS} 

और भी बहुत कुछ बिंदु make चलाने में नहीं है जब आप कर रहे हैं पहले से ही make चल रहा है - कम से कम, इस संदर्भ में नहीं। शायद रिकर्सिव ऑपरेशंस (विभिन्न निर्देशिकाओं में) के लिए, लेकिन 'Recursive Make Considered Harmful' देखें।

इसके अलावा, आपके मेकफ़ाइल को सामान्य रूप से 'all' लक्ष्य प्रदान करना चाहिए और इसे सामान्यतः इसलिए पहला और इसलिए डिफ़ॉल्ट लक्ष्य होना चाहिए।

4

आप का निर्माण और अधिक से अधिक चलाने के लिए जा रहे हैं, आप इस के साथ मदद करने के लिए history आदेश का उपयोग कर सकते हैं:

# Run this once 
make && ./foo 

# Repeat last command 
!! 
+2

और भी बेहतर , बैश में आप "मेक" से शुरू होने वाले अंतिम कमांड को दोहराने के लिए '! make' का उपयोग कर सकते हैं, भले ही आप अन्य कमांड को बीच में चलाएं। वह वर्कफ़्लो मेरे लिए बहुत अच्छा काम करता है। –

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