如何处理此 Linux C++警告? "can't find linker symbol for virtual table for `sockaddr_in'"

How do I approach this Linux C++ warning? "can't find linker symbol for virtual table for `sockaddr_in'"

本文关键字:for 何处理 symbol linker find virtual table in sockaddr 警告 C++      更新时间:2023-10-16

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

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

谢谢

GDB 仍然不够完美,尤其是在调试C++代码时。

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

GDB 错误数据库中打开了两个错误,它们完全是这样的消息(针对不同的结构/类)。我不会太担心它,除非它妨碍了您的调试。

在包含声明sockadd_in结构的标头之前,尝试使用 extern "C"。

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

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