2012-10-20 17 views
5

Używam Boost :: iostreams do jednoczesnego zapisu na mojej konsoli i pliku. Kiedy używam eclipse do debugowania (oczywiście z gdb), otrzymuję ostrzeżenie, które mówi, że nie znaleziono symbolu RTTI dla jednej z klas, których używam z Boost :: iostreams.komunikat ostrzegawczy Nie znaleziono symbolu RTTI podczas używania boost :: iostreams

Oto minimalny kod do odtworzenia problemu.

#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; 
} 

Kiedy przekroczenia linii TeeStream cool_cout(my_tee); trakcie debugowania, i otrzymać poniższe ostrzeżenia:

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>' 

Ostrzeżenia powtarzają się, gdy obiekt cool_cout napotyka. Jak to naprawić? Oczywiście programy używające tego kodu działają i nie mam z tym żadnych problemów. Ostrzeżenia nie powinny być ignorowane i istnieje pewna wiedza na temat symboli RTTI, które należy zdobyć. (Nie mogę skompilować z -f nortti, a następnie wykonywalne narzekania, że ​​rtti powinno zdecydowanie umożliwić korzystanie z iostreams)

Odpowiedz

8

Ostrzeżenia, które powinny Cię zainteresować, pochodzą z kompilatora, który faktycznie tworzy twój program. Użytkownicy końcowi nie powinni używać debuggera i nie ma to wpływu na twój plik binarny.

Podczas gdy gdb czasami znajduje problemy, wiele z ostrzeżeń w nim zawartych jest takich, że gdb pochłania symbole debugowania, a konsument (gdb) ma błędy i defence. Często po prostu zmniejszają funkcjonalność gdb. W tym przypadku jest mniej informacji o tej klasie dostępnych w debugerze. Ułatwia debugowanie, ale nie szkodzi samej aplikacji.

Masz kilka możliwości rozwiązania tego problemu.

  1. Zignoruj ​​ostrzeżenie w gdb i przejdź do życia.
  2. Uzyskaj źródła dla gdb i spróbuj znaleźć problem i zgłoś poprawkę. Jestem pewien, że byłby mile widziany.
  3. Użyj innego debuggera. (Wszystkie alternatywy, które widziałem, są płatnymi produktami).
  4. Przepisz program, aby nie używać żadnych szablonów. Obsługa szablonów gdb jest tam, gdzie istnieje większość problemów związanych z wyszukiwaniem symboli.
+0

dzięki za odpowiedź. Chciałbym pójść z wyborem2, gdybym tylko miał wystarczająco dużo czasu. tak czy inaczej będę odpowiadał deweloperom gdb. Nie mam wyboru4. Właśnie użyłem biblioteki Boost i jak mam jej nie używać? – hAcKnRoCk

Powiązane problemy