ทำ: ไม่มีอะไรจะทำเพื่อʻall '


99

ฉันกำลังทำเช่น pgm เพื่อสร้างไฟล์ make

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'.

โปรดช่วยฉันทำความเข้าใจเพื่อรวบรวมโปรแกรมนี้


13
ลองทำ "ทำความสะอาด" ตามด้วย "ทำทั้งหมด"
Paul R

11
นั่นไม่ใช่ข้อผิดพลาด แต่หมายความว่าhelloเป็นข้อมูลล่าสุดแล้ว เปลี่ยนcleanเป็นrm -f *.o helloก่อนที่จะทำสิ่งที่ไม่คาดคิดจากนั้นเรียกใช้make clean allและดูว่าได้ผลหรือไม่
จ้า

1
นอกจากนี้คุณยังควรเพิ่ม.phony: all cleanตั้งแต่allและcleanไม่ได้ชื่อไฟล์
Kerrek SB

3
อย่าใส่ -c ใน CFLAGS ของคุณ
wildplasser

คำตอบ:


126

บางครั้งข้อผิดพลาด "ไม่ต้องทำทั้งหมด" อาจเกิดจากช่องว่างก่อนคำสั่งในกฎ makefile แทนที่จะเป็นแท็บ โปรดตรวจสอบให้แน่ใจว่าคุณใช้แท็บแทนช่องว่างภายในกฎของคุณ

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

แทน

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

โปรดดูคู่มือการจัดทำ GNU สำหรับคำอธิบายไวยากรณ์ของกฎ: https://www.gnu.org/software/make/manual/make.html#Rule-Syntax


obj-m + = hello.o ทั้งหมด: </t> make -C / lib / modules / $ (shell uname -r) / build M = $ (PWD) module clean: make -C / lib / modules / $ ( shell uname -r) / build M = $ (PWD) clean
Narendra Jaggi

ไฟล์ด้านบนเป็นไฟล์ที่ถูกต้องหรือไม่ ??
Narendra Jaggi

ในบริบทของการสร้างไฟล์แม่ลูกบางครั้งข้อผิดพลาด "ไม่มีอะไรต้องทำสำหรับทั้งหมด" อาจเกิดจากเป้าหมายลูกที่มีการประกาศไม่ถูกต้อง PHONY ใน Makefile หลัก
donhector

ฉันมีซึ่งผมเปลี่ยนไป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 127after sudo make. ความช่วยเหลือใด ๆ
Mooncrater

@Mooncrater ดูgnu.org/software/make/manual/make.html#Rule-Syntax ที่นี่อ่าน: รายการสูตรอาหารเริ่มต้นด้วยอักขระแท็บ (หรืออักขระตัวแรกในค่าของตัวแปร. RECIPEPREFIX โปรดดูตัวแปรพิเศษ) บรรทัดสูตรอาหารแรกอาจปรากฏในบรรทัดหลังข้อกำหนดเบื้องต้นโดยมีอักขระแท็บหรืออาจปรากฏในบรรทัดเดียวกันโดยมีเครื่องหมายอัฒภาค ไม่ว่าจะด้วยวิธีใดผลก็เหมือนกัน ดังนั้นข้อกำหนดเบื้องต้นของคุณก็กลายเป็นสูตรอาหาร คุณไม่จำเป็นต้องมีแท็บในกรณีนี้
VirtualVDX

31

ลบhelloไฟล์ออกจากโฟลเดอร์ของคุณแล้วลองอีกครั้ง

allเป้าหมายขึ้นอยู่กับhelloเป้าหมาย helloเป้าหมายแรกที่พยายามที่จะหาไฟล์ที่สอดคล้องกันในระบบแฟ้ม หากพบและเป็นข้อมูลล่าสุดของไฟล์ที่อ้างอิงก็ไม่ต้องทำ


obj-m + = hello.o ทั้งหมด: </t> make -C / lib / modules / $ (shell uname -r) / build M = $ (PWD) module clean: make -C / lib / modules / $ ( shell uname -r) / build M = $ (PWD) clean
Narendra Jaggi

ข้างบนนี้เป็นไฟล์ make ที่ถูกต้องหรือไม่
Narendra Jaggi

21

เมื่อคุณให้ make มันทำให้กฎข้อแรกใน makefile ของคุณคือ "all" คุณได้ระบุว่า "ทั้งหมด" ขึ้นอยู่กับ "สวัสดี" ซึ่งขึ้นอยู่กับ main.o, factorial.o และ hello.o ดังนั้น 'make' จึงพยายามดูว่ามีไฟล์เหล่านั้นอยู่หรือไม่

หากมีอยู่ให้ 'make' ดูว่าการอ้างอิงของพวกเขาเช่น main.o มีการพึ่งพา main.c มีการเปลี่ยนแปลงหรือไม่ หากมีการเปลี่ยนแปลงให้สร้างใหม่มิฉะนั้นจะข้ามกฎ ในทำนองเดียวกันการสร้างไฟล์ที่มีการเปลี่ยนแปลงซ้ำ ๆ และในที่สุดก็เรียกใช้คำสั่งอันดับต้น ๆ "ทั้งหมด" ในกรณีของคุณเพื่อให้คุณสามารถเรียกใช้งานได้ "สวัสดี" ในกรณีของคุณ

หากไม่มีให้สร้างทุกอย่างภายใต้กฎสุ่มสี่สุ่มห้า

เมื่อมาถึงปัญหาของคุณไม่ใช่ข้อผิดพลาด แต่ 'make' กำลังบอกว่าการพึ่งพาใน makefile ของคุณเป็นปัจจุบันและไม่จำเป็นต้องทำอะไรเลย!


16

ทำให้เป็นพฤติกรรมที่ถูกต้อง helloมีอยู่แล้วและไม่เก่ากว่า.cไฟล์ดังนั้นจึงไม่มีงานที่ต้องทำอีกต่อไป มีสี่สถานการณ์ที่จะต้องสร้าง (ใหม่):

  • หากคุณแก้ไข.cไฟล์ใดไฟล์หนึ่งของคุณไฟล์นั้นจะใหม่กว่าhelloจากนั้นจะต้องสร้างใหม่เมื่อคุณเรียกใช้ make
  • ถ้าคุณลบ helloมันจะต้องสร้างใหม่อย่างชัดเจน
  • คุณสามารถบังคับให้ make สร้างใหม่ทุกอย่างได้ด้วย-Bตัวเลือกmake -B all
  • make clean allจะลบhelloและต้องสร้างใหม่ (ฉันแนะนำให้คุณดูความคิดเห็นของ @ Mat เกี่ยวกับrm -f *.o hello

4

ฉันคิดว่าคุณพลาดแท็บในบรรทัดที่ 9 บรรทัดต่อจากทั้งหมด: สวัสดีต้องเป็นแท็บว่าง ตรวจสอบให้แน่ใจว่าคุณมีแท็บว่างในบรรทัดที่ 9 จะทำให้ล่ามเข้าใจว่าคุณต้องการใช้สูตรเริ่มต้นสำหรับ makefile


4

นั่นไม่ใช่ข้อผิดพลาด คำสั่ง make ใน unix ทำงานตามการประทับเวลา เช่นสมมติว่าคุณได้ทำการเปลี่ยนแปลงบางอย่างfactorial.cppและคอมไพล์โดยใช้makemake แสดงข้อมูลที่ดำเนินการเฉพาะ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 $@

หวังว่านี่จะช่วยใครสักคน!

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.