0Pricing
C Academy · บทเรียน

Makefile

ทำให้การสร้างโปรเจกต์เป็นอัตโนมัติ

Makefile เป็นบทเรียน C Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน C Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส C Academy มีบทเรียนทั้งหมด 4 บทเรียน

เหตุผลที่ใช้ Makefile

การพิมพ์คำสั่ง gcc ด้วยตนเองจะจัดการได้ยากอย่างรวดเร็ว make จะอ่าน Makefile ซึ่งอธิบายวิธีสร้างโครงการ แล้วเรียกใช้เฉพาะคำสั่งที่จำเป็น

จุดเด่นสำคัญคือ จะสร้างไฟล์ใหม่ก็ต่อเมื่ออินพุตของไฟล์นั้นมีเวลาแก้ไขใหม่กว่าเอาต์พุต ช่วยประหยัดเวลาคอมไพล์ได้มาก

โครงสร้างของกฎ

กฎหนึ่งข้อมีสามส่วน ได้แก่ เป้าหมาย สิ่งที่ต้องมีก่อน และสูตรคำสั่ง

บรรทัดสูตรคำสั่งต้องขึ้นต้นด้วยอักขระ MUST ซึ่งเป็นอักขระ TAB จริง ไม่ใช่ช่องว่าง นี่เป็นข้อผิดพลาดใน Makefile ที่พบได้บ่อยที่สุด

target: prerequisite1 prerequisite2
	<TAB>command to build target

Makefile แรก

ไฟล์นี้สร้าง app จากไฟล์ต้นฉบับสองไฟล์ การเรียกใช้ make โดยไม่ระบุอาร์กิวเมนต์จะสร้างเป้าหมายแรก

หากไม่มีไฟล์ต้นฉบับใดเปลี่ยนแปลงนับจากการสร้างครั้งก่อน make จะแสดงข้อความ 'up to date' แล้วไม่ทำอะไร

app: main.c math_utils.c
	gcc main.c math_utils.c -o app

กฎการคอมไพล์แยกไฟล์

การสร้างไฟล์ออบเจ็กต์แยกกันทำให้เมื่อไฟล์หนึ่งเปลี่ยนแปลง จะคอมไพล์ใหม่เฉพาะไฟล์นั้น

make จะทำตามกราฟการพึ่งพา: เมื่อ main.c เปลี่ยนแปลง จะเรียกทำใหม่เฉพาะ main.o และการเชื่อมโยงขั้นสุดท้าย

app: main.o math_utils.o
	gcc main.o math_utils.o -o app

main.o: main.c math_utils.h
	gcc -c main.c

math_utils.o: math_utils.c math_utils.h
	gcc -c math_utils.c

ตัวแปร

ตัวแปรช่วยลดการเขียนซ้ำ กำหนดตัวแปรไว้ด้านบน แล้วขยายค่าด้วย $(NAME)

จากนั้นการเปลี่ยนคอมไพเลอร์หรือแฟล็กจะทำได้จากที่เดียว

CC = gcc
CFLAGS = -Wall -Wextra -g

app: main.o math_utils.o
	$(CC) main.o math_utils.o -o app

ตัวแปรอัตโนมัติ

make มีรูปแบบย่อให้ใช้ภายในสูตรคำสั่ง:

  • $@ — ชื่อเป้าหมาย
  • $^ — สิ่งที่ต้องมีก่อนทั้งหมด
  • $< — สิ่งที่ต้องมีก่อนรายการแรก

ตัวแปรเหล่านี้ช่วยให้สูตรคำสั่งสั้นและถูกต้อง

app: main.o math_utils.o
	$(CC) $^ -o $@

main.o: main.c
	$(CC) $(CFLAGS) -c $< -o $@

กฎรูปแบบ

กฎรูปแบบหนึ่งข้อสามารถคอมไพล์ไฟล์ .c ทุกไฟล์เป็นไฟล์ .o ที่สอดคล้องกันได้ คุณจึงไม่ต้องเขียนกฎแยกสำหรับแต่ละไฟล์

% จะแทนส่วนแกนกลางใดก็ได้ และเมื่อใช้ร่วมกับ $< และ $@ ก็จะเป็นกฎทั่วไปอย่างสมบูรณ์

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

เป้าหมายจำลอง

เป้าหมายอย่าง clean ไม่ได้สร้างไฟล์ชื่อเดียวกันขึ้นมา ให้ประกาศเป้าหมายเหล่านี้เป็น .PHONY เพื่อให้ make เรียกใช้เสมอ แม้ว่าจะมีไฟล์ชื่อ 'clean' อยู่ก็ตาม

clean จะลบไฟล์ผลลัพธ์จากการสร้าง เพื่อบังคับให้สร้างใหม่ทั้งหมด

.PHONY: clean
clean:
	rm -f *.o app

Makefile ฉบับสมบูรณ์

เมื่อนำทุกอย่างมารวมกัน จะมีตัวแปร กฎรูปแบบ กฎการเชื่อมโยง และเป้าหมายจำลองสำหรับ clean

โครงสร้างนี้รองรับไฟล์จำนวนมากได้โดยไม่ต้องแก้ไขแยกตามไฟล์

CC = gcc
CFLAGS = -Wall -Wextra -g
OBJS = main.o math_utils.o

app: $(OBJS)
	$(CC) $^ -o $@

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

.PHONY: clean
clean:
	rm -f $(OBJS) app

วิธีที่ make ใช้ตัดสินใจ

make จะเปรียบเทียบเวลาประทับ เป้าหมายจะถูกสร้างใหม่หากสิ่งที่ต้องมีก่อนรายการใดมีเวลาแก้ไขใหม่กว่า หรือหากยังไม่มีเป้าหมายนั้นอยู่

นี่คือเหตุผลที่การระบุการพึ่งพาไฟล์ส่วนหัวมีความสำคัญ: เมื่อแก้ไขไฟล์ส่วนหัว ออบเจ็กต์ทุกไฟล์ที่พึ่งพาไฟล์นั้นจะถูกสร้างใหม่อย่างถูกต้อง

หลายเป้าหมายและค่าเริ่มต้น

เป้าหมายแรกใน Makefile จะเป็นค่าเริ่มต้น และจะทำงานเมื่อคุณพิมพ์ make โดยไม่ระบุอะไร ตามธรรมเนียมแล้วเป้าหมายนี้ชื่อ all

คุณยังสามารถสร้างเป้าหมายเฉพาะด้วยชื่อได้ เช่น make clean หรือ make test ทำให้ Makefile เดียวมีจุดเริ่มต้นที่มีประโยชน์หลายแบบ

.PHONY: all
all: app

test: app
	./app --selftest

ตรวจสอบความเข้าใจอย่างรวดเร็ว

วิเคราะห์ข้อผิดพลาดคลาสสิกของ Makefile

ทบทวน

ตอนนี้คุณสามารถทำให้การสร้างด้วย make เป็นอัตโนมัติได้แล้ว:

  • กฎประกอบด้วยเป้าหมาย สิ่งที่ต้องมีก่อน และสูตรคำสั่งที่ย่อหน้าด้วย TAB
  • ตัวแปรและตัวแปรอัตโนมัติ ($@ $^ $<) ช่วยลดการเขียนซ้ำ
  • กฎรูปแบบ (%.o: %.c) จัดการไฟล์ทุกไฟล์ด้วยวิธีทั่วไป
  • .PHONY ใช้ทำเครื่องหมายเป้าหมายที่ไม่ใช่ไฟล์ เช่น clean
  • make จะสร้างใหม่เฉพาะสิ่งที่ล้าสมัย โดยพิจารณาจากเวลาประทับ

ถัดไป: การสร้างไลบรารีแบบสแตติกและแบบใช้ร่วมกัน

คำถามที่พบบ่อย

บทเรียน “Makefile” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “Makefile” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส C Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส C Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “Makefile”

ทำให้การสร้างโปรเจกต์เป็นอัตโนมัติ คุณปฏิบัติ C Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน C Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน C Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน

บทเรียน “Makefile” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน C Academy นี้ได้ไหม

ได้ บทเรียน C Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. การคอมไพล์แบบมีเงื่อนไข
  2. โปรเจกต์หลายไฟล์
  3. Makefile
  4. ไลบรารีสแตติกและไลบรารีใช้ร่วมกัน
← กลับไปที่ C Academy