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

คอมไพล์หลายไฟล์

สร้างโปรแกรมที่ประกอบด้วยหลายไฟล์

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

จากต้นฉบับสู่โปรแกรม

การเปลี่ยนต้นฉบับภาษา C หลายไฟล์ให้เป็นโปรแกรมที่เรียกใช้งานได้มีสองขั้นตอน ได้แก่ การคอมไพล์ และ การเชื่อมโยง

ไฟล์ .c แต่ละไฟล์จะถูกคอมไพล์แยกกันเป็นไฟล์ออบเจ็กต์ จากนั้นตัวเชื่อมโยงจะรวมไฟล์ออบเจ็กต์ทั้งหมด แก้การอ้างอิงระหว่างไฟล์ และสร้างเป็นโปรแกรมที่เรียกใช้งานได้หนึ่งโปรแกรม

การสร้างด้วยคำสั่งเดียว

วิธีที่ง่ายที่สุดคือส่งไฟล์ต้นฉบับทุกไฟล์ให้ gcc ในครั้งเดียว คอมไพเลอร์จะสร้างแต่ละไฟล์แล้วเชื่อมโยงให้โดยอัตโนมัติ

ตัวเลือก -o ใช้ตั้งชื่อโปรแกรมผลลัพธ์ ให้ระบุไฟล์ .c ทั้งหมด ส่วนส่วนหัวจะถูกนำเข้าผ่าน #include และไม่ต้องระบุไว้ที่นี่

gcc main.c math_utils.c -o app

การคอมไพล์แยกกัน

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

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

gcc -c main.c        /* produces main.o */
gcc -c math_utils.c  /* produces math_utils.o */

ขั้นตอนการเชื่อมโยง

เมื่อมีไฟล์ออบเจ็กต์แล้ว ให้เชื่อมโยงไฟล์เหล่านั้นเป็นโปรแกรมที่เรียกใช้งานได้ ในขั้นตอนนี้ gcc จะทำหน้าที่เป็นตัวเชื่อมโยง รวมไฟล์ออบเจ็กต์และแก้สัญลักษณ์ระหว่างไฟล์

ครั้งนี้ไม่ใช้ -c เพราะเราต้องการโปรแกรมสุดท้าย ไม่ใช่ไฟล์ออบเจ็กต์อีกไฟล์หนึ่ง

gcc main.o math_utils.o -o app

ตัวเชื่อมโยงทำอะไร

ตัวเชื่อมโยงจะจับคู่ การใช้งาน สัญลักษณ์แต่ละครั้งกับ การกำหนด ของสัญลักษณ์นั้น

เมื่อ main.o เรียกใช้ add ตัวเชื่อมโยงจะค้นหา add ที่กำหนดไว้ใน math_utils.o แล้วเชื่อมทั้งสองเข้าด้วยกัน นอกจากนี้ยังนำโค้ดจากไลบรารีมาตรฐานที่โปรแกรมต้องใช้เข้ามาด้วย

ข้อผิดพลาดจากการอ้างอิงที่ไม่ถูกกำหนด

หากคุณลืมไฟล์ออบเจ็กต์ขณะเชื่อมโยง ตัวเชื่อมโยงจะไม่พบการกำหนดและจะแจ้ง การอ้างอิงที่ไม่ถูกกำหนด

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

gcc main.o -o app
/* undefined reference to `add' */
/* fix: include math_utils.o */

ตัวเลือกคำเตือนที่มีประโยชน์

ให้คอมไพล์โดยเปิดใช้คำเตือนเสมอ -Wall และ -Wextra จะช่วยแสดงข้อผิดพลาดที่อาจเกิดขึ้นตั้งแต่เนิ่น ๆ

การเพิ่ม -std=c11 จะเลือกมาตรฐานภาษา ทำให้พฤติกรรมระหว่างคอมไพเลอร์ต่าง ๆ คาดเดาได้ ตัวเลือกเหล่านี้ใช้ได้ทั้งการคอมไพล์ในขั้นตอนเดียวและการคอมไพล์แยกกัน

gcc -Wall -Wextra -std=c11 -c main.c
gcc -Wall -Wextra -std=c11 -c math_utils.c
gcc main.o math_utils.o -o app

เส้นทางส่วนหัว

เมื่อส่วนหัวอยู่ในไดเรกทอรีอื่น ให้บอกคอมไพเลอร์ว่าจะค้นหาที่ใดด้วย -I

ตัวอย่างเช่น -Iinclude จะเพิ่มโฟลเดอร์ include/ ลงในเส้นทางค้นหา ทำให้ #include "math_utils.h" ค้นพบไฟล์ได้แม้อยู่คนละโฟลเดอร์

gcc -Iinclude -c src/main.c -o build/main.o

เหตุใดการคอมไพล์ใหม่จึงสำคัญ

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

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

/* edited math_utils.c only */
gcc -c math_utils.c
gcc main.o math_utils.o -o app

ทำงานอัตโนมัติด้วย make

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

ตัวอย่างขนาดเล็กนี้เชื่อมโยงออบเจ็กต์สองไฟล์เป็น app โดย make จะติดตามเวลาที่ไฟล์ถูกแก้ไขเพื่อเลือกว่าจะคอมไพล์ไฟล์ใดใหม่

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

ทบทวนกระบวนการสร้างทั้งหมด

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

คอมไพล์ต้นฉบับแต่ละไฟล์ แล้วเชื่อมโยงไฟล์ออบเจ็กต์ จากนั้นเรียกใช้ผลลัพธ์เพื่อยืนยันว่าทำงานได้ครบทุกขั้นตอน

gcc -Wall -c main.c
gcc -Wall -c math_utils.c
gcc main.o math_utils.o -o app
./app

ตรวจสอบความเข้าใจ

ตรวจสอบความเข้าใจของคุณเกี่ยวกับกระบวนการสร้างโปรแกรมหลายไฟล์

ทบทวน

คุณได้เรียนรู้การคอมไพล์ไฟล์ .c แต่ละไฟล์เป็นออบเจ็กต์ด้วย -c แล้วเชื่อมโยงออบเจ็กต์เหล่านั้นเป็นโปรแกรม ใช้ -Wall และ -I สำหรับคำเตือนและเส้นทางส่วนหัว

การอ้างอิงที่ไม่ถูกกำหนดหมายถึงมีไฟล์ออบเจ็กต์หายไปขณะเชื่อมโยง เครื่องมืออย่าง make ช่วยทำให้การสร้างใหม่เฉพาะส่วนที่เปลี่ยนแปลงเป็นแบบอัตโนมัติ

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

บทเรียน “คอมไพล์หลายไฟล์” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “คอมไพล์หลายไฟล์”

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

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

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

บทเรียน “คอมไพล์หลายไฟล์” ใช้เวลานานแค่ไหน

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

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

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

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

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