如何处理此Linux C ++警告? “找不到`sockaddr_in'的虚拟表的链接器符号”

时间:2012-04-19 12:15:08

标签: c++ eclipse linker-warning

Ubuntu 10.04 32位,eclipse,C和C ++

我有一个程序,它使用select()来监视一堆TCP和UDP端口。我使用 sockaddr_in 结构以通常的方式创建这些端口(socket(),bind(),listen(),accept()等。)

该程序在命令行正常工作。当我注意到以下警告时,我正在使用eclipse调试器修复一个错误(现在修复!):

warning: can't find linker symbol for virtual table for `sockaddr_in' value
warning:   found `operator delete(void*)' instead

好吧,在修复我的错误后,我检查了警告并且警告仍然存在。

我知道一旦我进入配置端口/套接字连接的ConfigureServer()例程,警告就会开始。 sockaddr_in结构在例程中声明并且在堆栈中。事实上,程序中还没有任何内容。这是C和C ++的混合,到目前为止还没有声明或使用过对象。

这是常规的开始。其他端口还有几个相同的位。

int      configureServer()
{
   sockaddr_in         servAddr; 

   memset(&servAddr, 0, sizeof(servAddr));
   servAddr.sin_family        = AF_INET;        
   servAddr.sin_port          = htons( g_tcpPorts[0].serverPort ); 
   servAddr.sin_addr.s_addr   = htonl(INADDR_ANY); 

   /* Create and initialize the TCP socket */
   if (( g_tcpPorts[0].serverSock = socket(AF_INET, SOCK_STREAM, IPPROTO_IP)) < 0 )
   {
      PLOG( ERROR ) << "failed to acquire a socket for IO Control Server port:  " << g_tcpPorts[0].serverPort;
      return -1;     // caller will CloseAllPorts();
   } 

// ...........
}

所以,我的问题是,如何调试和追踪这些警告的原因。

谢谢,

2 个答案:

答案 0 :(得分:3)

GDB仍然不太完美,特别是在调试C ++代码时。

在这种情况下,sockaddr_in是“普通旧数据”(没有任何C ++特性的C结构)。它不需要也不应该有任何虚拟表。如果GDB不这么认为,这就是GDB的问题。

There are two bugs open in GDB bug database that quite this exact message(针对不同的结构/类)。除非它妨碍你的调试,否则我不会太担心它。

答案 1 :(得分:0)

在包含声明sockadd_in结构的头文件之前,尝试使用extern“C”。

extern "C"
{
#  include <netinet/in.h>
}

这可能会确保sockaddr_in不会或不需要vtab。