2009-11-07 34 views
35

Gần bước cuối cùng nhưng vẫn còn một số erros lạ ....Ký hiệu không xác định "vtable cho ..." và "typeinfo for ..."?

bash-3.2$ make 
g++ -Wall -c -g Myworld.cc 
g++ -Wall -g solvePlanningProblem.o Position.o AStarNode.o PRM.o PRMNode.o World.o SingleCircleWorld.o Myworld.o RECTANGLE.o CIRCLE.o -o solvePlanningProblem 
Undefined symbols: 
    "vtable for Obstacle", referenced from: 
     Obstacle::Obstacle()in Myworld.o 
    "typeinfo for Obstacle", referenced from: 
     typeinfo for RECTANGLEin RECTANGLE.o 
     typeinfo for CIRCLEin CIRCLE.o 
ld: symbol(s) not found 
collect2: ld returned 1 exit status 
make: *** [solvePlanningProblem] Error 1 

ý nghĩa của vtable và typeinfo là gì?

+0

Hãy nhớ quay lại [câu hỏi ban đầu của bạn] (http://stackoverflow.com/questions/1693471/undefined-symbols-ld-symbol-not-found) và đăng một số mã hoặc trả lời một số câu hỏi mà mọi người có hỏi bạn ở đó. Điều đó có thể sẽ giúp bạn có được kết quả nhanh hơn. :) – Troubadour

+0

tôi thực sự muốn nhưng trang web chỉ thiếu, cảm ơn, tôi sẽ quay lại – Lisa

+0

xin vui lòng tìm câu trả lời ở đây! http://stackoverflow.com/questions/1458180/vtable-for-referenced-from-compile-error-xcode –

Trả lời

1

vtable và typeinfo là các cấu trúc bên trong được tạo bởi trình biên dịch C++. vtable được sử dụng để gọi các hàm bậc thầy và typeinfo được sử dụng cho RTTI.

Trình biên dịch khác nhau có các chiến lược khác nhau khi chúng tạo ra các cấu trúc này. Một chiến lược tôi đã thấy là họ sẽ tạo ra bảng trong cùng một tệp đối tượng chứa hàm ảo đầu tiên trong lớp.

+0

theo như lỗi trên có liên quan, những biểu tượng không xác định nghĩa là gì? – Lisa

2

Bạn có tệp Obstacle.cc không? Nếu vậy, bạn cần đảm bảo nó được tích hợp vào Obstacle.o và rằng Obstacle.o được thêm vào dòng lệnh khi bạn liên kết chương trình của mình.

Ngoài ra, hãy đảm bảo rằng bạn xác định tất cả các phương pháp không thuần ảo mà bạn khai báo. Nếu bạn khai báo một destructor ảo thuần túy, bạn cũng cần định nghĩa nó.

+0

Tôi phải có Obstacle.cc, vì nó chỉ có một số chức năng ảo? – Lisa

+0

@Lisa: không nhất thiết, nhưng việc xác định các phương thức/chức năng không phải mẫu nội tuyến trong tệp .h có thể dẫn đến lỗi liên kết khác (nhiều định nghĩa). Vì vậy, tôi sẽ giả định rằng tất cả mọi thứ trong Obstacle là nội tuyến. Bạn đã viết định nghĩa cho tất cả các hàm thành viên của Obstacle, bao gồm cả hàm tạo và phá hủy? Lưu ý rằng nếu Obstacle có một destructor ảo thuần túy, bạn vẫn phải viết một định nghĩa cho nó. – bk1e

+0

Chướng ngại vật chỉ có các chức năng ảo thuần túy? Tấn công điều đó - nó không quan trọng khi nói đến vtables. Bạn cần một Obstacle.o để trình biên dịch có nơi nào đó để lưu trữ thông tin kiểu bảng và loại ảo của Obstacle. – outis

70

Nếu Chướng ngại vật là một lớp cơ sở trừu tượng, thì chắc chắn rằng bạn khai báo tất cả các phương pháp ảo của nó "thuần túy ảo":

virtual void Method() = 0; 

Các = 0 nói với trình biên dịch rằng phương pháp này phải được ghi đè bởi một lớp dẫn xuất, và có thể không có triển khai riêng.

Nếu lớp chứa bất kỳ hàm ảo không thuần túy, trình biên dịch sẽ giả định rằng chúng có triển khai ở đâu đó và cấu trúc bên trong của nó (vtable và typeinfo) có thể được tạo trong cùng một tệp đối tượng. nếu các chức năng đó không được triển khai thì các cấu trúc bên trong sẽ bị thiếu và bạn sẽ gặp phải các lỗi này.

+0

Tôi chỉ gặp vấn đề này trong mã của riêng tôi. Tôi tìm thấy trang này thông qua tìm kiếm của Google và tôi đã thực hiện thay đổi mà bạn đã nói và sửa đổi nó. Cảm ơn! : D – Aishwar

+0

Giống như trên - được tìm thấy trên google - giải quyết vấn đề ngay lập tức, giải pháp nhanh chóng và dễ dàng! Tôi đã thêm một thành viên ảo thuần túy khác vào danh sách các hàm ảo và quên thêm mã thông báo = 0! oops – Marm0t

+0

Câu trả lời hay - cũng đã giải quyết được vấn đề của tôi! – TCSGrad

5

Trở ngại lớp cần có trình phá hủy ảo. Thay đổi định nghĩa của hàm hủy là:

virtual ~Obstacle(); 

Định nghĩa về trình phá hủy cũng tạo ra vtable cho một lớp có chức năng ảo. Nó cũng đảm bảo rằng việc xóa một thể hiện lớp dẫn xuất thông qua một con trỏ lớp cơ sở làm điều đúng.

(bản sao của câu trả lời của tôi để chất vấn What should I do with this strange error? đó có vẻ là một trùng lặp.)

+2

Trong trường hợp của tôi, tôi không chỉ cần xác định destructor mà còn quên xác định việc triển khai trong tệp cpp của tôi. – Ricket

1

Có một lý do bạn có thể nhận được lỗi này, và chỉ muốn ghi lại nó ở đây. Tôi đã liên kết với một thư viện tĩnh mà không có RTTI. Vì vậy, bằng cách sử dụng cờ C++ -fno-rtti cố định cho tôi. Nếu bạn không cần RTTI, bạn cũng có thể sử dụng cờ này. Hi vọng điêu nay co ich.

Các vấn đề liên quan