Tôi đang phát triển mã cho một hệ thống nhúng (cụ thể là PSoC 5, sử dụng Trình tạo PSoC) và viết bằng C++.Tại sao Vtables không được triển khai đúng trên nền tảng nhúng?
Mặc dù tôi đã vượt qua hầu hết các rào cản với việc sử dụng C++, trước tiên hãy biên dịch bằng C++ bằng cờ biên dịch -x c++
, xác định toán tử mới và xóa, đảm bảo ngoại lệ không được ném cờ biên dịch -fno-exception
. vào một bức tường gạch khi nói đến việc sử dụng các chức năng ảo.
Nếu tôi thử và khai báo hàm ảo, trình biên dịch sẽ cho tôi lỗi undefined reference to "vtable for __cxxabiv1::__class_type_info"
. Cách duy nhất để giải quyết vấn đề này là sử dụng cờ biên dịch -fno-rtti
để ngăn lỗi và làm cho nó biên dịch thành công. Tuy nhiên, nếu tôi làm điều đó, chương trình nhúng bị treo khi cố gắng chạy hàm ảo bị quá tải, và tôi nghĩ điều này là do vtable không tồn tại.
Tôi không thấy lý do tại sao bạn không thể triển khai vtables trên nền tảng được nhúng, vì tất cả là không gian thừa trong bộ nhớ trước hoặc sau đối tượng thành viên (tùy thuộc vào trình biên dịch chính xác).
Lý do tôi đang cố gắng sử dụng các chức năng ảo là vì tôi muốn sử dụng FreeRTOS với C++ và những người khác đã thực hiện điều này bằng cách sử dụng các chức năng ảo (xem http://www.freertos.org/FreeRTOS_Support_Forum_Archive/July_2010/freertos_Is_it_possible_create_freertos_task_in_c_3778071.html để thảo luận, và https://github.com/yuriykulikov/Event-driven_Framework_for_Embedded_Systems). khung công tác)
Bạn liên kết thư viện thực thi/chia sẻ của mình như thế nào? – jxh
Bạn có chắc chắn điều này là do thực tế là bạn biên dịch cho một nền tảng nhúng? Bạn đã thử biên dịch các phần liên quan của mã trên nền tảng chuẩn chưa? – jogojapan
IDE PSoC chạy tập lệnh trình liên kết như là một phần của quá trình xây dựng. Tôi đã bao gồm cờ '-lstdC++' để đảm bảo nó gắn kết với thư viện chuẩn C++. – gbmhunter