बनाओ: कुछ नहीं `सभी के लिए किया जाना है


97

मैं एक फ़ाइल बनाने के लिए उदाहरण के लिए pgm से गुजर रहा हूँ।

http://mrbook.org/tutorials/make/

मेरा फ़ोल्डर eg_make_creation में निम्न फ़ाइलें हैं,

desktop:~/eg_make_creation$ ls
factorial.c  functions.h  hello  hello.c  main.c  Makefile

makefile

# I am a comment, and I want to say that the variable CC will be
# the compiler to use.
CC=gcc
# Hwy!, I am comment no.2. I want to say that CFLAGS will be the
#options I'll pass to the compiler
CFLAGS=-c -Wall

all:hello

hello:main.o factorial.o hello.o
  $(CC) main.o factorial.o hello.o -o hello

main.o:main.c
  $(CC) $(CFLAGS) main.c

factorial.o:factorial.c
  $(CC) $(CFLAGS) factorial.c

hello.o:hello.c
  $(CC) $(CFLAGS) hello.c

clean:
  rm -rf *o hello

त्रुटि:

desktop:~/eg_make_creation$ make all
make: Nothing to be done for `all'.

कृपया मुझे इस कार्यक्रम को संकलित करने में समझने में मदद करें।


12
"मेक क्लीन" करने की कोशिश करें, इसके बाद "मेक ऑल"
पॉल आर

11
यह एक त्रुटि नहीं है, यह सिर्फ मतलब helloहै अप टू डेट है। कुछ अप्रत्याशित cleanकरने rm -f *.o helloसे पहले बदलें , फिर दौड़ें make clean allऔर देखें कि क्या काम करता है।
चटाई

1
आप यह भी जोड़ना चाहिए .phony: all cleanके बाद से, allऔर cleanफ़ाइल नाम नहीं हैं।
केरेक एसबी

3
अपने CFLAGS में -c मत डालें।
Wildplasser 12

जवाबों:


121

कभी-कभी "सभी के लिए कुछ भी नहीं किया जाता है" त्रुटि टैब के बजाय मेकफाइल नियम में कमांड से पहले रिक्त स्थान के कारण हो सकती है। कृपया सुनिश्चित करें कि आप अपने नियमों के अंदर रिक्त स्थान के बजाय टैब का उपयोग करते हैं।

all:
<\t>$(CC) $(CFLAGS) ...

के बजाय

all:
    $(CC) $(CFLAGS) ...

कृपया नियम सिंटैक्स विवरण के लिए GNU मेनुअल मैनुअल देखें : https://www.gnu.org/software/make/manual/make.html#Rule-Syntax


obj-m + = hello.o all: </ t> make -C / lib / मॉड्यूल / $ (शेल uname -r) / build M = $ (PWD) मॉड्यूल साफ: make -C / lib / मॉड्यूल / $ ( शेल uname -r) / बिल्ड M = $ (PWD) साफ
नरेंद्र जग्गी

उपरोक्त फ़ाइल वैध फ़ाइल है ??
नरेंद्र जग्गी

पैरेंट-चाइल्ड मेकफाइल्स के संदर्भ में, कभी-कभी "सभी के लिए कुछ भी नहीं किया जाना चाहिए" बच्चे के लक्ष्य के कारण त्रुटि हो सकती है, जिसे माता-पिता मेकफाइल में घोषित किया गया है ।PHONY।
२३:

मेरे पास था all : src/server/mod_wsgi.la, जिसे मैंने बदल दिया all : </t> src/server/mod_wsgi.la। अब मुझे त्रुटि मिलती है: के make: execvp: src/server/mod_wsgi.la: Permission denied Makefile:29: recipe for target 'all' failed make: *** [all] Error 127बाद sudo make। कोई मदद?
मूनक्रेटर

@Mooncrater देखें gnu.org/software/make/manual/make.html#Rule-Syntax । यहाँ पढ़ता है: नुस्खा लाइनें एक टैब वर्ण (या .RIPIPEPFIX चर के मान में पहला वर्ण; विशेष चर देखें) से शुरू होती हैं। पहली नुस्खा पंक्ति किसी पूर्वापेक्षा के साथ, पूर्वापेक्षा के बाद लाइन पर दिखाई दे सकती है, या अर्धविराम के साथ एक ही लाइन पर दिखाई दे सकती है। किसी भी तरह से, प्रभाव समान है। तो, आपकी शर्त बस नुस्खा बन गई। आपको इस मामले में किसी टैब की आवश्यकता नहीं है।
VirtualVDX

31

helloफ़ाइल को अपने फ़ोल्डर से निकालें और पुन: प्रयास करें।

allलक्ष्य पर निर्भर करता है helloलक्ष्य। helloलक्ष्य पहले फाइल सिस्टम में इसी फ़ाइल खोजने के लिए कोशिश करता है। अगर यह मिल जाता है और यह निर्भर फ़ाइलों के साथ अद्यतित है - कुछ नहीं करना है।


obj-m + = hello.o all: </ t> make -C / lib / मॉड्यूल / $ (शेल uname -r) / build M = $ (PWD) मॉड्यूल साफ: make -C / lib / मॉड्यूल / $ ( शेल uname -r) / बिल्ड M = $ (PWD) साफ
नरेंद्र जग्गी

क्या उपरोक्त एक वैध फ़ाइल है?
नरेंद्र जग्गी

21

जब आप सिर्फ मेक देते हैं, तो यह आपके मेकफाइल में पहला नियम बनाता है, अर्थात "ऑल"। आपने निर्दिष्ट किया है कि "सभी" "हैलो" पर निर्भर करता है, जो main.o, factorial.o और hello.o पर निर्भर करता है। इसलिए 'मेक' यह देखने की कोशिश करता है कि क्या वे फाइलें मौजूद हैं।

यदि वे मौजूद हैं, तो 'मेक' देखती है कि क्या उनकी निर्भरताएँ, उदाहरण के लिए main.o की निर्भरता main.c है, बदल गई है। यदि वे बदल गए हैं, तो उन्हें पुनर्निर्मित करें, अन्यथा नियम को छोड़ देता है। इसी तरह से यह उन फ़ाइलों के निर्माण पर जाता है, जो बदल गई हैं और अंत में आपके मामले में एक निष्पादन योग्य, 'हैलो' देने के लिए आपके मामले में सबसे अधिक "कमांड" को चलाती हैं।

यदि वे मौजूद नहीं हैं, तो आंख बंद करके नियम के तहत सब कुछ बनाएं।

आपकी समस्या के लिए, यह एक त्रुटि नहीं है, लेकिन 'मेक' यह कह रहा है कि आपके मेकफाइल में हर निर्भरता अद्यतित है और इसे कुछ भी बनाने की आवश्यकता नहीं है!


16

बनाओ सही ढंग से व्यवहार कर रहा है। helloपहले से मौजूद है और .cफ़ाइलों से पुराना नहीं है , और इसलिए कोई और काम नहीं करना है। चार परिदृश्य हैं जिनमें बनाने के लिए (पुनः) निर्माण की आवश्यकता होगी:

  • यदि आप अपनी .cफ़ाइलों में से एक को संशोधित करते हैं , तो यह नए की तुलना में नया होगा hello, और फिर इसे बनाने के लिए फिर से बनाना होगा।
  • यदि आप हटाते हैं hello, तो यह स्पष्ट रूप से इसे पुनर्निर्माण करना होगा
  • आप -Bविकल्प के साथ सब कुछ पुनर्निर्माण करने के लिए मजबूर कर सकते हैं ।make -B all
  • make clean allहटा देगा helloऔर पुनर्निर्माण की आवश्यकता होगी। (मेरा सुझाव है कि आप @ Mat की टिप्पणी के बारे में देखेंrm -f *.o hello

4

मुझे लगता है कि आपने 9 वीं पंक्ति में एक टैब को याद किया। सभी के बाद की रेखा : हैलो एक खाली टैब होनी चाहिए। सुनिश्चित करें कि आपके पास 9 वीं पंक्ति में एक खाली टैब है। यह दुभाषिया को समझाएगा कि आप मेकफाइल के लिए डिफ़ॉल्ट नुस्खा का उपयोग करना चाहते हैं।


4

वह कोई त्रुटि नहीं है; टाइमस्टैम्प के आधार पर यूनिक्स कार्यों में कमांड बनाते हैं। आइए हम कहते हैं कि यदि आपने कुछ बदलाव किए हैं factorial.cppऔर उपयोग करने के लिए संकलन करते हैं, makeतो यह जानकारी दिखाता है कि केवल cc -o factorial.cppकमांड निष्पादित है। अगली बार अगर आप उसी कमांड को निष्पादित करते हैं, यानी विस्तार के makeसाथ किसी भी फ़ाइल में कोई बदलाव किए बिना .cpp, कंपाइलर कहता है कि आउटपुट फ़ाइल अद्यतित है। कंपाइलर यह जानकारी तब तक देता है जब तक हम किसी में कुछ बदलाव नहीं करते हैं file.cpp

इसका लाभ makefileयह है कि यह केवल संशोधित फ़ाइलों को संकलित करके और .oअसम्बद्धित फ़ाइलों के ऑब्जेक्ट ( ) फ़ाइलों का उपयोग करके पुन: जमा करने के समय को कम कर देता है ।


0

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

foo/apple.o: bar/apple.c $(FOODEPS)

%.o: %.c
    $(CC) $< -o $@

मेरे पास इस तरह से कई निर्भरताएं थीं, और मैं उन सभी के लिए एक पैटर्न नुस्खा का उपयोग करने की कोशिश कर रहा था। स्पष्ट रूप से, "%" के लिए एक एकल प्रतिस्थापन यहाँ काम करने वाला नहीं है। मैंने प्रत्येक निर्भरता के लिए स्पष्ट नियम बनाए, और मैंने खुद को पिल्लों और गेंडा के बीच वापस पाया!

foo/apple.o: bar/apple.c $(FOODEPS)
    $(CC) $< -o $@

आशा है कि यह किसी की मदद करता है!

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.