ทำ: ไม่มีอะไรจะทำเพื่อʻ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.