我该如何处理这个Linux下C ++的警告? “找不到了`sockaddr_in的虚表链接符号”

2019-10-16 14:54发布

Ubuntu的10.04 32位,蚀,C和C ++

我有一个使用select()来监视一堆TCP和UDP端口的程序。 我创建以通常的方式这些端口使用的sockaddr_in结构(插座(),绑定(),听(),接受()等)。

该程序在命令行工作正常。 我用的是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 ++的没有声明或使用直到该点的对象的混合。

这是开始ODF的程序。 还有其它端口一些额外的相同的比特。

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();
   } 

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

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

谢谢,

Answer 1:

GDB仍然不够完美,特别是当它涉及到调试C ++代码。

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

有两个错误在GDB bug数据库开放相当多这个确切的消息 (对于不同的结构/班)。 我不会担心太多,除非它得到您的调试方式。



Answer 2:

尝试使用可能外部的“C”包括申报sockadd_in结构中的头前。

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

这可能会,投保SOCKADDR_IN不会有或需要vtab。



文章来源: How do I approach this Linux C++ warning? “can't find linker symbol for virtual table for `sockaddr_in'”