2010-07-10 34 views
241
CC=g++ 
CFLAGS=-c -Wall 
LDFLAGS= 
SOURCES=main.cpp hello.cpp factorial.cpp 
OBJECTS=$(SOURCES:.cpp=.o) 
EXECUTABLE=hello 

all: $(SOURCES) $(EXECUTABLE) 

$(EXECUTABLE): $(OBJECTS) 
    $(CC) $(LDFLAGS) $(OBJECTS) -o [email protected] 

.cpp.o: 
    $(CC) $(CFLAGS) $< -o [email protected] 

[email protected] और $< क्या करते हैं?

+4

ऊपर दिया गया लिंक टूट गया है, यहाँ एक और एक है: http://www.gnu.org/software/make/manual/html_node/Automatic-Variables.html – asciz

+1

हाय क्या इस ".cpp.o करता है : "एक लक्ष्य के रूप में मतलब है? (पिछली पंक्ति?)। –

+3

".cpp.o:" का अर्थ है ".cpp" (स्रोत फ़ाइलें) – jaguzu

उत्तर

287

[email protected] फ़ाइल उत्पन्न होने का नाम है, और $< पहली शर्त (आमतौर पर स्रोत फ़ाइल) है। आप GNU Make manual में इन सभी विशेष चरों की एक सूची पा सकते हैं।

उदाहरण के लिए, निम्नलिखित घोषणा पर विचार करें:

all: library.cpp main.cpp 

इस मामले में:

  • [email protected] का मूल्यांकन करता है करने के लिए all
  • $<library.cpp
  • $^ का मूल्यांकन library.cpp main.cpp
  • +०१२३५१६४१०६१ का मूल्यांकन
+5

यह ध्यान देने योग्य है कि '$ @' को फ़ाइल होने की आवश्यकता नहीं है, यह 'PHONY' लक्ष्य का नाम भी हो सकता है। – Ephemera

+0

क्या मैं कमांडलाइन विकल्पों में जोड़ सकता हूं: '$ @ s' को असेंबली-आउटपुट जैसे नाम.ओएस उत्पन्न करने के लिए? –

31

[email protected] और $< विशेष मैक्रोज़ हैं।

कहाँ:

[email protected] लक्ष्य का फ़ाइल नाम है।

$< पहली निर्भरता का नाम है।

57

[email protected] और $< स्वचालित चर कहा जाता है। [email protected] आउटपुट चर है। $< पहला इनपुट चर है। उदाहरण के लिए:

hello.o: hello.c hello.h 
     gcc -c $< -o [email protected] 

यहां, hello.o आउटपुट फ़ाइल है। यह [email protected] का विस्तार करता है। पहली निर्भरता hello.c है। यही $< है।

-c ध्वज .o फ़ाइल उत्पन्न करता है; अधिक विस्तृत स्पष्टीकरण के लिए man gcc देखें। -o फ़ाइल को आउटपुट में निर्दिष्ट करता है।

अधिक जानकारी के लिए, आप this पढ़ सकते हैं।

इसके अलावा, आप जीएनयू मैनुअल देख सकते हैं। बेहतर बनाने के लिए अपने मेकफ़ाइल को डीबग करने का एक तरीका है।

हो जाएगा ताकि उत्पादन makefile डेटाबेस:

$make -p 
+1

आपका उत्तर '$ <' की तरह लगता है 'hello.c hello.h' (दोनों) तक विस्तारित होगा। कृपया स्पष्ट करें। –

+0

हां, इसमें hello.c और hello.h –

+8

'$ <' दोनों ही शामिल होंगे। सभी को शामिल करने के लिए, '$ ^' का उपयोग करें। –

23

Managing Projects with GNU Make, 3rd Edition से (यह के अंतर्गत है GNU Free Documentation License):

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

  • [email protected]: फ़ाइल नाम लक्ष्य का प्रतिनिधित्व

    सात "मूल" स्वत: चर रहे हैं।

  • $%: एक संग्रह सदस्य विनिर्देश का फ़ाइल नाम तत्व।

  • $<: पहली शर्त का फ़ाइल नाम।

  • $?: लक्ष्य से अलग सभी पूर्व शर्त के नाम, रिक्त स्थान से अलग हैं।

  • $^: रिक्त स्थान से अलग सभी पूर्वापेक्षाएँ के फ़ाइल नाम। यह सूची में अधिकांश उपयोगों के लिए डुप्लिकेट फ़ाइल नाम हटा दिए गए हैं, जैसे कि संकलन, प्रतिलिपि आदि, डुप्लिकेट नहीं चाहते थे।

  • $+: $^ के सामान, इसका सभी आवश्यक शर्तें के नाम की रिक्ति द्वारा अलग सिवाय इसके कि $+ डुप्लिकेट शामिल है। यह चर विशिष्ट स्थितियों के लिए बनाया गया था जैसे कि लिंकर्स के लिए तर्क जहां डुप्लिकेट मानों का अर्थ है।

  • $*: लक्ष्य फ़ाइल नाम का तने। एक स्टेम आम तौर पर इसके प्रत्यय के बिना एक फ़ाइल नाम है। पैटर्न नियमों के बाहर इसका उपयोग निराश है।

इसके अलावा, ऊपर चर के एक दूसरे को बनाता है के साथ संगतता के लिए दो वेरिएंट है। एक संस्करण केवल मूल्य के निर्देशिका भाग देता है। यह प्रतीक, $(@D), $(<D) आदि पर "डी" को जोड़कर इंगित किया जाता है। अन्य संस्करण केवल मूल्य के भाग को लौटाता है। यह प्रतीक, $(@F), $(<F) इत्यादि में "एफ" को जोड़कर इंगित किया गया है। ध्यान दें कि ये संस्करण नाम से अधिक वर्ण हैं और इसलिए कोष्ठक में संलग्न होना चाहिए। जीएनयू डीआईआर और नोटडीर कार्यों के साथ एक और अधिक पठनीय विकल्प प्रदान करता है।

9

Makefile अगर main.cpp, hello.cpp, factorial.cpp में से किसी एक को बदल दिया hello निष्पादन योग्य बनाता है।कि विनिर्देश प्राप्त करने के लिए छोटी संभव Makefile हो सकता था:

hello: main.cpp hello.cpp factorial.cpp 
    g++ -o hello main.cpp hello.cpp factorial.cpp 
  • समर्थक: रखरखाव बुरा सपना, सी ++ निर्भरता के दोहराव
  • चोर: बहुत
  • चोर को पढ़ने के लिए आसान दक्षता बात नहीं, हम पुन: संयोजित सभी सी ++ भले ही केवल एक बदल दिया गया हो

उपरोक्त में सुधार करने के लिए, हम केवल उन सी ++ फ़ाइलों को संकलित करते हैं जिन्हें संपादित किया गया था। फिर, हम परिणामस्वरूप ऑब्जेक्ट फ़ाइलों को एक साथ जोड़ते हैं।

OBJECTS=main.o hello.o factorial.o 

hello: $(OBJECTS) 
    g++ -o hello $(OBJECTS) 

main.o: main.cpp 
    g++ -c main.cpp 

hello.o: hello.cpp 
    g++ -c hello.cpp 

factorial.o: factorial.cpp 
    g++ -c factorial.cpp 
  • समर्थक: फिक्स दक्षता मुद्दा
  • चोर: नई रखरखाव बुरा सपना, वस्तु फ़ाइलों नियमों पर संभावित टाइपो

इस पर सुधार करने के लिए, हम सब वस्तु फ़ाइल नियम एक एकल के साथ की जगह ले सकता .cpp.o नियम:

OBJECTS=main.o hello.o factorial.o 

hello: $(OBJECTS) 
    g++ -o hello $(OBJECTS) 

.cpp.o: 
    g++ -c $< -o [email protected] 
  • समर्थक: एक छोटी makefile होने के लिए वापस, कुछ हद तक आसान

को पढ़ने के लिए यहां .cpp.o शासन को परिभाषित करता है anyfile.cpp से anyfile.o निर्माण करने के लिए कैसे। पहले निर्भरता को

  • $< मैचों, इस मामले में, anyfile.cpp
  • [email protected] लक्ष्य से मेल खाता है, इस मामले में, anyfile.o

अन्य Makefile में मौजूद परिवर्तन कर रहे हैं:

  • यह आसान जी ++ किसी भी सी ++ संकलक करने से परिवर्तन compilers को बनाना।
  • कंपाइलर विकल्पों को बदलने में आसान बनाना।
  • लिंकर विकल्पों को बदलने में आसान बनाना।
  • सी ++ स्रोत फ़ाइलों और आउटपुट को बदलने में आसान बनाना।
  • एक डिफ़ॉल्ट नियम 'सब' जोड़ा गया जो त्वरित जांच के रूप में कार्य करता है यह सुनिश्चित करने के लिए कि आपकी सभी स्रोत फाइलें आपके आवेदन को बनाने के प्रयास से पहले मौजूद हैं।
संबंधित मुद्दे