2012-10-20 40 views
5

Tôi sử dụng Boost :: iostreams để ghi đồng thời vào bảng điều khiển và tệp của mình. Khi tôi sử dụng eclipse để gỡ lỗi (với gdb tất nhiên), tôi nhận được một cảnh báo mà nói RTTI biểu tượng không tìm thấy cho một trong các lớp học mà tôi đang sử dụng từ Boost :: iostreams.Thông báo cảnh báo Biểu tượng RTTI không tìm thấy khi sử dụng boost :: iostreams

Đây là mã tối thiểu để tái tạo sự cố.

#ifndef BOOST_IO_STREAM_H_ 
#define BOOST_IO_STREAM_H_ 

#include <fstream> 
#include <boost/iostreams/tee.hpp> 
#include <boost/iostreams/stream.hpp> 
using boost::iostreams::tee_device; 
using boost::iostreams::stream; 

typedef tee_device<std::ostream, std::ofstream> TeeDevice; 
typedef stream<TeeDevice> TeeStream; 

#endif /* BOOST_IO_STREAM_H_ */ 

int 
main() 
{ 

    /* A config file to output experiment details */ 
    std::string self_filename = "./experimentconfig.txt"; 
    std::ofstream fconfig(self_filename.c_str()); 
    TeeDevice my_tee(std::cout, fconfig); 
    TeeStream cool_cout(my_tee); 

    cool_cout << "Output to file and console during experiment run" << std::endl; 

    return 0; 
} 

Khi tôi băng qua đường TeeStream cool_cout(my_tee); trong gỡ lỗi, tôi nhận được những lời cảnh báo dưới đây:

warning: RTTI symbol not found for class 'boost::iostreams::stream<boost::iostreams::tee_device<std::ostream, std::basic_ofstream<char, std::char_traits<char> > >, std::char_traits<char>, std::allocator<char> >' 
warning: RTTI symbol not found for class 'boost::iostreams::stream_buffer<boost::iostreams::tee_device<std::ostream, std::basic_ofstream<char, std::char_traits<char> > >, std::char_traits<char>, std::allocator<char>, boost::iostreams::output>' 

Các cảnh báo được lặp đi lặp lại bất cứ khi nào cool_cout đối tượng được gặp. Làm thế nào để tôi sửa lỗi này? Tất nhiên, các chương trình sử dụng mã này hoạt động và tôi không có vấn đề gì với điều đó. Cảnh báo không được bỏ qua và có một số kiến ​​thức ngoài kia về các biểu tượng RTTI cần đạt được. (Tôi không thể biên dịch với -f nortti sau đó thực thi than phiền rằng rtti chắc chắn nên được kích hoạt để sử dụng iostreams)

Trả lời

8

Cảnh báo bạn nên quan tâm là từ trình biên dịch, đó là những gì thực sự tạo ra chương trình của bạn. Người dùng cuối không nên sử dụng trình gỡ lỗi và nó không ảnh hưởng đến bản thân nhị phân của bạn.

Mặc dù gdb đôi khi tìm thấy sự cố, nhiều cảnh báo trong đó là do gdb sử dụng các biểu tượng gỡ lỗi và người tiêu dùng (gdb) có lỗi và lỗi. Thông thường chúng chỉ làm giảm chức năng của gdb. Trong trường hợp này, có ít thông tin hơn về lớp đó có sẵn bên trong trình gỡ lỗi. Nó làm cho việc gỡ lỗi trở nên khó khăn hơn, nhưng không làm tổn thương bản thân ứng dụng.

Bạn có nhiều lựa chọn cho việc cần làm về lỗi này.

  1. Bỏ qua cảnh báo trong gdb và tiếp tục cuộc sống.
  2. Lấy nguồn cho gdb và cố gắng tìm sự cố và gửi bản vá. Tôi chắc chắn nó sẽ được hoan nghênh.
  3. Sử dụng trình gỡ lỗi khác. (Tất cả các thay thế tôi đã thấy là các sản phẩm được trả tiền.)
  4. Viết lại chương trình để không sử dụng bất kỳ mẫu nào. Xử lý mẫu gdb là nơi phần lớn các vấn đề tra cứu ký hiệu tồn tại.
+0

cảm ơn câu trả lời của bạn. Tôi thích đi với choice2 nếu tôi chỉ có đủ thời gian. anyways tôi sẽ tương ứng với các nhà phát triển gdb. Tôi không nhận được choice4 mặc dù. Tôi vừa sử dụng thư viện Boost và làm cách nào để không sử dụng các mẫu? – hAcKnRoCk

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