使用boost :: iostreams时找不到警告消息RTTI符号

时间:2012-10-20 07:19:42

标签: gdb eclipse-cdt rtti debug-symbols boost-iostreams

我使用Boost :: iostreams同时写入我的控制台和文件。当我使用eclipse进行调试时(当然使用gdb),我会收到一条警告,说明我在Boost :: iostreams中使用的其中一个类没有找到RTTI符号。

以下是重现问题的最小代码。

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

当我在调试期间越过TeeStream cool_cout(my_tee);行时,我收到以下警告:

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

每当遇到对象cool_cout时,都会重复警告。我该如何解决?当然,使用此代码的程序可以工作,我也没有问题。警告不应该被忽略,并且有一些关于必须获得的RTTI符号的知识。 (我无法使用-f nortti编译,然后可执行文件抱怨rtti肯定应该启用以使用iostreams)

1 个答案:

答案 0 :(得分:6)

您应该关注的警告来自编译器,这是实际创建程序的内容。最终用户不应该使用调试器,它对您的二进制文件本身没有影响。

虽然gdb有时会发现问题,但其中的许多警告都是因为gdb使用调试符号,而使用者(gdb)存在错误和防范。通常他们只是减少了gdb的功能。 在这种情况下,调试器中可用的类的信息较少。它使调试更加困难,但不会损害应用程序本身。

您有多种选择可以解决此错误。

  1. 忽略gdb中的警告并继续生活。
  2. 获取gdb的来源并尝试找到问题并提交补丁。我相信它会受到欢迎。
  3. 使用其他调试器。 (我见过的所有替代品都是付费产品。)
  4. 重写程序以不使用任何模板。 gdb模板处理是存在大多数符号查找问题的地方。