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 targetMakefile แรก
ไฟล์นี้สร้าง 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 appMakefile ฉบับสมบูรณ์
เมื่อนำทุกอย่างมารวมกัน จะมีตัวแปร กฎรูปแบบ กฎการเชื่อมโยง และเป้าหมายจำลองสำหรับ 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ