แนวทางที่ดีที่สุดในการดีบัก Linking Errors
ใน C++
การดีบัก linking errors มักจะรู้สึกเหมือนการเดินในเขาวงกตโดยไม่มีแผนที่ โดยเฉพาะเมื่อทำงานกับโค้ดเบสที่ไม่คุ้นเคย หากคุณเคยพบว่าตัวเองจ้องมองที่ข้อความแสดงข้อผิดพลาดที่มีความหมายแปลกประหลาดระหว่างการสร้างโปรเจกต์ C++ คุณไม่ใช่คนเดียว บล็อกโพสต์นี้จะสำรวจแนวทางที่ดีที่สุดในการจัดการกับ linking errors โดยการแบ่งกลยุทธ์ที่นักพัฒนาสามารถใช้ในการค้นหาและแก้ไขปัญหาเหล่านี้ได้อย่างมีประสิทธิภาพ
เข้าใจปัญหา
Linking errors เกิดขึ้นเมื่อ linker ไม่สามารถแก้ไขการอ้างอิงไปยังสัญลักษณ์ภายนอก (เช่น ฟังก์ชันหรือพารามิเตอร์) ที่โค้ดของคุณต้องการ ข้อผิดพลาดเหล่านี้อาจเกิดจากหลายสาเหตุ เช่น:
- ลืมรวมไฟล์วัตถุที่จำเป็น
- ขาดการพึ่งพาภายนอก
- ความผิดพลาดในการพิมพ์ในชื่อฟังก์ชันหรือพารามิเตอร์
ตัวอย่างของ Linking Error
เพื่อให้เข้าใจ linking errors ได้ดียิ่งขึ้น ลองดูข้อความแสดงข้อผิดพลาดทั่วไปที่พบใน Visual Studio โดยเฉพาะ VS 2005:
ByteComparator.obj : error LNK2019: unresolved external symbol "int __cdecl does_not_exist(void)" (?does_not_exist@@YAHXZ) referenced in function "void __cdecl TextScan(struct FileTextStats &,char const *,char const *,bool,bool,__int64)" (?TextScan@@YAXAAUFileTextStats@@PBD1_N2_J@Z)
ในข้อผิดพลาดนี้:
ByteComparator.obj
แสดงถึงไฟล์วัตถุที่เกิดข้อผิดพลาด- ฟังก์ชันที่ชื่อว่า
does_not_exist()
ได้รับการเน้นว่าเป็นสัญลักษณ์ที่ไม่สามารถแก้ไขได้
กลยุทธ์ในการดีบัก Linking Errors
ขั้นตอนที่ 1: ค้นหาต้นตอของปัญหา
ใช้ข้อความแสดงข้อผิดพลาดเพื่อตรวจหาต้นตอไฟล์ที่ทำให้เกิดปัญหา ในตัวอย่างของเรา คุณจะ:
- มองหาไฟล์
ByteComparator.cpp
ในโปรเจกต์ของคุณ - ค้นหาในโค้ดเบสของคุณเพื่อหาการนำไปใช้ของ
does_not_exist()
ขั้นตอนที่ 2: ตรวจสอบการเชื่อมโยงอย่างถูกต้อง
หลังจากระบุว่าฟังก์ชันถูกกำหนดไว้ที่ไหน ให้มั่นใจว่า linker รู้ว่าจะหามันได้ที่ไหน นี่คือวิธีการทำตามสภาพแวดล้อมการพัฒนาของคุณ:
สำหรับ Visual Studio (VS2005)
- คลิกขวาที่โปรเจกต์ของคุณใน Solution Explorer และเลือก Project Dependencies…
- ตรวจสอบให้แน่ใจว่าโครงการที่มีฟังก์ชัน
does_not_exist()
รวมอยู่ในความพึ่งพา
สำหรับ GCC
- เปิดไฟล์ makefile ของคุณและตรวจสอบคำสั่งการคอมไพล์ที่สร้างไฟล์ปฏิบัติการของคุณ
- เพิ่มไฟล์วัตถุที่ขาดหายไปรวมถึง (เช่น
ByteComparator.o
) ไปในรายการไฟล์วัตถุในคำสั่งนั้น
ขั้นตอนที่ 3: ตรวจสอบการพึ่งพาภายนอก
บางครั้ง linking errors เกิดจากการขาดหายไปของไลบรารีหรือการพึ่งพาภายนอก โดยเฉพาะอย่างยิ่งกับการเรียกใช้ Windows API วิธีการแก้ปัญหาประเภทนี้คือ:
-
ระบุไลบรารีที่ขาดหายไป: เมื่อพบสัญลักษณ์ที่ไม่สามารถแก้ไขได้ ให้ตรวจสอบเอกสารประกอบไลบรารีเพื่อตรวจสอบว่าไลบรารีไหนที่คุณจำเป็นต้องเชื่อมโยง
-
เชื่อมโยงไลบรารี:
- สำหรับ Visual Studio: ไปที่คุณสมบัติของโปรเจกต์ของคุณและไปที่
Configuration Properties->Linker->Input->Additional Dependencies
. - เพิ่มชื่อไลบรารีที่จำเป็น (เช่น
Winmm.lib
สำหรับtimeGetTime()
)
- สำหรับ Visual Studio: ไปที่คุณสมบัติของโปรเจกต์ของคุณและไปที่
-
อ้างอิงเอกสาร: เสมอให้ตรวจสอบแพลตฟอร์มเช่น MSDN หรือใช้เครื่องมือค้นหาเพื่อหาข้อมูลเอกสาร API ที่จำเป็น
สรุป
Linking errors อาจสร้างความหงุดหงิด แต่การเข้าใจวิธีการค้นหาปัญหาอย่างมีระบบสามารถช่วยให้คุณแก้ไขปัญหาได้อย่างรวดเร็วและมีประสิทธิภาพ โดยการปฏิบัติตามขั้นตอนง่ายๆ เหล่านี้—การค้นหาต้นตอของปัญหา การรับประกันว่ามีการเชื่อมโยงที่ถูกต้องในการสร้างของคุณ และการตรวจสอบว่ามีการพึ่งพาไลบรารีภายนอกหรือไม่—คุณสามารถทำให้โปรเจกต์ C++ ของคุณกลับมาทำงานได้อีกครั้ง
จำไว้ว่าทุกข้อผิดพลาดเป็นโอกาสในการเรียนรู้เกี่ยวกับโค้ดเบสของคุณและพัฒนาทักษะการดีบักของคุณให้ดีขึ้น ขอให้สนุกกับการเขียนโค้ด!