2010-02-02 30 views
5

Bây giờ và sau đó khi sử dụng GCC tôi nhận được lỗi khó hiểu như thế này:Debugging vtable Linker lỗi trong GCC

tài liệu tham khảo không xác định để 'vtable cho classname'

Khi nó không được gây ra bởi một thư viện mất tích, không- này thông báo lỗi rất mô tả luôn luôn làm cho tôi đào sâu qua các tệp mã theo từng dòng để tìm việc triển khai thiếu cho một hàm ảo. Có cách nào để làm cho trình liên kết cho tôi biết mà chức năng ảo nào bị thiếu, có thể là cờ hay gì đó không? Hoặc là nó có thể nói với tôi nhưng tôi không hiểu những gì nó nói?

Trả lời

2

Từ gcc faq:

Khi xây dựng C++, các mối liên kết nói nhà xây dựng của tôi, hủy hoặc ảo bảng là không xác định, nhưng tôi định nghĩa họ

C++ chuẩn ISO xác định rằng tất cả các phương thức ảo của một lớp mà không phải là virtual virtual virtual , nhưng không yêu cầu bất kỳ chẩn đoán nào vì vi phạm quy tắc này [class.virtual]/8. Dựa trên giả định này, GCC sẽ chỉ phát ra các nhà thầu được xác định ngầm định, các nhà khai thác , hủy và bảng ảo của một lớp học theo định nghĩa phương pháp không nội tuyến đầu tiên.

Do đó, nếu bạn không xác định phương thức cụ thể này, mối liên kết có thể khiếu nại về việc thiếu định nghĩa cho các biểu tượng dường như không liên quan. Thật không may, để cải thiện thông báo lỗi này, có thể là cần thiết để thay đổi trình liên kết và điều này không phải lúc nào cũng được thực hiện.

Giải pháp là đảm bảo rằng tất cả các phương pháp ảo không tinh khiết là được xác định. Lưu ý rằng một destructor phải được xác định ngay cả khi nó được khai báo pure-virtual [class.dtor]/7.

Giải pháp mà tôi áp dụng là tìm kiếm tên lớp và tìm kiếm phương pháp ảo khai báo và kiểm tra xem có định nghĩa nào không. Tôi đã không tìm thấy bất kỳ giải pháp khác cho việc này.