2016-02-03 3 views
5

मैं वर्तमान में एक C++ पाठ्यपुस्तक के माध्यम से काम कर रहा हूं; मैं, पुस्तक, और जड़ में एक भी makefile में अभ्यास के लिए अलग फ़ोल्डर के लिए इतना है कि रूट निर्देशिका में मैंएक निर्दिष्ट निर्देशिका में सभी स्रोत संकलित करने के लिए एक मेकफ़ाइल

make directoryName 

टाइप कर सकते हैं और यह है कि निर्देशिका में सभी स्रोतों संकलन होगा चाहते हैं, और रूट में एक बाइनरी आउटपुट। यहाँ मैं अब तक है:

FLAGS= -Wall -Wextra -Wfloat-equal 
OUT=helloworld.out 

%: $(wildcard [email protected]/*.cpp) 
    g++ [email protected]/$(wildcard *.cpp) -o $(OUT) $(FLAGS) 

लेकिन जब मैं इसे चलाने के लिए प्रयास करते हैं, सब मैं

pc-157-231:Section2$ make helloWorld 
make: `helloWorld' is up to date. 

है किसी भी मदद की सराहना की

संपादित नोट; समस्या यह नहीं है कि मैंने लक्ष्य फ़ाइल नहीं बदला है; मैंने किया ...

+0

HelloWorld बदलें और फिर उपयोग करें (गूंज, क्योंकि यह सभी नियमों का एक आदेश की अपेक्षा करता है) फ़ाइल बनाएं .. यहां कोई बदलाव नहीं था इसलिए संदेश दिखाया गया है – Grv

+0

मैंने इसे बदल दिया है, यह समस्या नहीं है –

+0

यही कारण है कि यह फ़ाइल अद्यतित है। यह केवल तभी संकलित होगा जब परिवर्तन हो .. यह – Grv

उत्तर

1

आपकी समस्या यह है कि स्वचालित जीएनयू [email protected] जैसे चर बनाते हैं, केवल नियम के शरीर के भीतर एक मान है। जीएनयू से दस्तावेज बनाते हैं।

[स्वचालित चर] को किसी नियम की पूर्व शर्त सूची में सीधे एक्सेस नहीं किया जा सकता है। एक सामान्य गलती पूर्वापेक्षा सूची में [email protected] का उपयोग करने का प्रयास कर रही है; यह काम नहीं करेगा। (source)

Additonally, आप $(wildcard ...) समारोह अपने नियम (शरीर में और शर्त सूची में दोनों) में, की जरूरत नहीं है, हालांकि यह एक गलती या तो नहीं है:

वाइल्डकार्ड विस्तार नियमों में अपने आप होता है । (source)

+0

स्पष्ट होने के लिए, ओपी क्या चाहता है संभव नहीं है, क्या आपका मतलब है? – kebs

+0

@kebs कम से कम सीधे नहीं। मैं "तकनीकी रूप से असंभव" नहीं कहूंगा क्योंकि मेकफ़ाइल में जीएनयू बनाने + खोल कमांड अत्यंत जटिल बनाने के नियमों को बनाने की अनुमति देते हैं। – kfx

0

मैं यह बहुत आसान बना देता है कि मेकअप के लिए एक स्थानापन्न लिखा है, लेकिन यह नहीं तो बहुत प्रयोगात्मक/नहीं-सरकारी तौर पर समर्थित आदि आप https://github.com/dascandy/bob से डाउनलोड कर सकते है।

आप शायद के रूप में लिख करने में सक्षम होगा: मध्यवर्ती वस्तुओं के साथ

FLAGS= -Wall -Wextra -Wfloat-equal  

# Take all cpp files in a folder & compile it to executable with that folder name as name. 
(.*)/.*\.cpp => \1.out 
    g++ -o [email protected] $^ $(FLAGS) 

या वैकल्पिक रूप से, (बड़ी परियोजनाओं के लिए बेहतर है, लेकिन शायद छोटे अभ्यास के लिए बेकार)

FLAGS= -Wall -Wextra -Wfloat-equal  

# Read as, compile any CPP file to a file with the same root but .o as extension 
(.*)\.cpp => \1.o 
    g++ -c -o [email protected] $^ $(FLAGS) 

# read as, take all objects in a subfolder together and compile into executable with folder name as name. 
(.*)/.*\.o => \1.out 
    g++ -o [email protected] $^ 

उपकरण ही Boost.Filesystem स्थापित करने की आवश्यकता है।

आप एक डिफ़ॉल्ट लक्ष्य है कि सभी निष्पादनयोग्य संकलित करना चाहते हैं, इन पंक्तियों जोड़ें:

.*.out => all 
    echo -n 

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