如何处理此 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'"
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。
相关文章:
- 警告处理为错误这里有什么问题
- "error: no matching function for call to"构造函数错误
- 表示"accepting anything for this template argument" C++概念的通配符
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 如何在C++中从两个单独的for循环中添加两个数组
- 在for循环中使用auto vs decltype(vec.size())来处理字符串的向量
- Python中的for循环与C++有何不同
- 在 for 循环中处理复杂的发送 recv 消息
- for 循环中未处理的异常
- 在这种情况下,我将如何继续 1 到 360 的"for loop"处理指针和地址?
- 在 for 循环中创建多个线程以处理 2D 数组
- IDL 接口,C++,CORBA,我正在处理"conflicting return type specified for"和"invalid abstract return type for memb
- 基于范围的for循环如何处理临时容器
- 预处理Emulator for JavaScript(定时/调试示例)
- 基于范围的 for 循环和 std::vector: 是按顺序处理的元素
- 如何处理此 Linux C++警告? "can't find linker symbol for virtual table for `sockaddr_in'"
- 基于范围的循环与 for-each 循环有何不同
- 将 java 字符串处理成原生 C/C++ for Android Studio+NDK
- for 循环,对数据进行批处理并在 C++ 中丢弃
- omp parallel for:如何让线程写入私有数组,并在所有线程完成处理后合并所有数组