2010-11-28 5 views
9

मेरे पास "main.c" नामक एक फ़ाइल है। क्या सबसे आसान मेकफ़ाइल मुझे इस फ़ाइल को निष्पादन योग्य में संकलित करना पड़ सकता है जिसे मैं ./blah चला सकता हूं?क्या सबसे आसान मेकफ़ाइल मैं एक सी फाइल के लिए काम कर सकता है?

+0

कृपया हमें पूछ से पहले अपना होमवर्क करना कुछ प्रयास करते हैं। एक कारण है कि आपका प्रोफेसर चाहता है कि आप मेकफ़ाइल का उपयोग करें - ताकि आप अधिक उपयोगी परियोजनाओं के लिए मेकफ़ाइल लिखना सीख सकें। –

+3

क्षमा करें, होमवर्क पुलिस को परेशान करने का मतलब नहीं था। मैंने इसे गुगलिंग करने का प्रयास किया है, लेकिन मेकफ़ाइल स्पष्ट रूप से अविश्वसनीय रूप से शक्तिशाली है, और यह बेहद जटिल हो सकता है। मैं आईवी को स्वीकार करता हूं क्योंकि इसमें कुछ परेशानी होती है। यह विषय एक प्रोग्रामिंग विषय नहीं है, लेकिन मूल्यांकन के लिए देशी ओएस कार्यों को कॉल करने के लिए सी कोड की आवश्यकता होती है। मैंने पहले कभी सी को छुआ नहीं है, और यह असाइनमेंट कुछ घंटों में है। मैं निराश था, और हताश और कुछ मदद की ज़रूरत थी। क्षमा करें अगर मैं आपको परेशान करता हूं। – Ash

उत्तर

9
all: 
    gcc -o blah main.c 

आपको यहां मेकफ़ाइल की आवश्यकता नहीं है, सरल खोल स्क्रिप्ट ठीक है।

+0

असाइनमेंट शीट का कहना है कि हमें मेकफ़ाइल शामिल करना होगा। – Ash

+0

जब मैंने इसका इस्तेमाल किया और 'मेक' चलाया - यह "मेकफ़ाइल: 2: *** गायब विभाजक देता है। रोकें।" – Ash

+1

@Ash: 'gcc' के सामने थोड़ा एक टैब होना चाहिए, न कि रिक्त स्थान। (यदि आप रिक्त स्थान का उपयोग करते हैं तो आपको वह त्रुटि मिलती है।) –

4
all: blah 
blah: main.c 
    gcc main.c -o blah 
+0

मैंने कुछ और दिखाए जाने से पहले अपना उत्तर लिखा और पोस्ट किया, और मुझे 'होमवर्क' टैग नहीं मिला। मैं क्रिस लुटज़ से सहमत हूं; आप जीवन में कहीं भी ऐसे दुखी कार्य पर मदद मांगने के लिए नहीं मिलेगा। –

+1

'सब: ब्लाह 'यह सब आसान बनाता है कि इसे चीजों को तोड़ने की ज़रूरत है और अगर' वास्तव में 'नाम की एक फ़ाइल वास्तव में मौजूद है। इस बिंदु के अलावा, यह सबसे अच्छा जवाब है। –

+0

वास्तव में, आगे विचार के बाद, इस साधारण मामले में 'सभी' नामक एक फ़ाइल निर्भरता जांच को तोड़ने वाला नहीं है; यह अभी भी अनावश्यक है क्योंकि किसी भी मामले में पहला लक्ष्य डिफ़ॉल्ट लक्ष्य के रूप में कार्य करेगा। –

10

आप चला रहे हैं जीएनयू करें और अगर आप अतिरिक्त पुस्तकालयों में लिंक करने के लिए की जरूरत नहीं है, सबसे सरल makefile कोई makefile बिल्कुल है। प्रयास करें:

make main 

आप main निर्दिष्ट करने के लिए नहीं करना चाहते हैं, तो आप निम्नलिखित एक पंक्ति का उपयोग कर सकते हैं Makefile:

all: main 

जीएनयू बनाओ कई अंतर्निहित नियम है कि यह अगर आप का उपयोग करता है उन्हें खुद को परिभाषित न करें। एक यह काम करता है कि है की तरह कुछ:

%: %.c 
     $(CC) $^ -o [email protected] 

अधिक जानकारी के लिए, देखें: http://www.gnu.org/software/make/manual/make.html#Using-Implicit

+0

स्पष्ट रूप से असाइनमेंट की आवश्यकता है कि आउटपुट 'blah' हो, न कि 'मुख्य', इसलिए उसे मेकफ़ाइल की आवश्यकता होगी। उपरोक्त अभी भी उपयोगी जानकारी है, लेकिन वास्तव में यहां लागू नहीं होगी। –

+1

यदि आपके निष्पादन योग्य को 'blah' कहा जाना चाहिए तो सबसे आसान होगा अगर आपकी अनुमति है तो आपकी स्रोत फ़ाइल को' blah.c' पर पुनर्नामित करें। –

+0

@ टी.जे.क्रॉडर: 'ब्लाह' एक आवश्यकता प्रतीत नहीं होता है, बल्कि एक उदाहरण है: ओपी ने कहा "मैं * * */blah' * चला सकता हूं। तो यह एक-लाइनर 'मेकफ़ाइल' ठीक लगता है – MestreLion

2

सरलतम मैं सिफारिश करेंगे है:

myprog: myprog.o 
     $(CC) -o [email protected] @^ 

वाया निहित नियमों, इस का परिणाम देगा एक अलग चरण जो इसे जोड़ने से पहले myprog.cmyprog.o संकलित करता है। कारण मुझे यह पसंद (अरनॉड द्वारा) अन्य जवाब की तुलना में बेहतर है कि यह makefile काफी विस्तार करने के लिए बिना अधिक स्रोत फ़ाइलों को मापता है:

myprog: myprog.o foo.o bar.o helper.o my.o your.o his.o her.o 
     $(CC) -o [email protected] @^ 
+0

क्या यह '@ ^' के बजाय '$ ^' होना चाहिए? – user2023370

0

रूप Jander कहा, यदि आपका स्रोत एक भी blah.c नाम की फ़ाइल है आप उत्पादन करने के लिए इस का उपयोग कर सकते एक निष्पादन blah नामित:

all: blah 

या भी:

blah: 

बाकी सब कुछ है अंतर्निहित जब जीएनयू make

का उपयोग करते समय यह अत्यंत सरल है, यह और अधिक जटिल कुछ उत्तर के ऊपर कुछ फायदे हैं करता है:

  • संकलक hardcoded नहीं है: अपने वातावरण आप के लिए gcc चयन करते हैं!
  • आपका प्रोग्राम नाम केवल एक बार, एक अच्छा DRY प्रोग्रामिंग अभ्यास सेट है।
  • इंटरमीडिएट *.o फ़ाइलों को नहीं बनाता है जो इस साधारण परियोजना के लिए आवश्यक नहीं हैं।

जिसके अनुसार, मैं दृढ़ता से आप कम से कम clean और all नियमों और -Wall झंडे जोड़कर अपने Makefile सुधार करने के लिए सुझाव देते हैं।यह निम्नलिखित Makefile के साथ किया जा सकता है, अभी भी सब से ऊपर फायदे रखने:

 
TARGET=blah 
CFLAGS=-Wall 

.PHONY: all clean 

all: $(TARGET) 

$(TARGET): 

clean: 
    rm -f $(TARGET) 
संबंधित मुद्दे