如果没有这些重新定义错误,就无法在我的源代码中包含linux/in6.h header :

In file included from mypmtud.cc:30:0: /usr/include/linux/in6.h:30:8: error: redefinition of ‘struct in6_addr’ In file included from /usr/include/netdb.h:28:0,
             from mypmtud.cc:23: /usr/include/netinet/in.h:198:8: error: previous definition of ‘struct in6_addr’ In file included from mypmtud.cc:30:0: /usr/include/linux/in6.h:46:8: error: redefinition of ‘struct sockaddr_in6’ In file included from /usr/include/netdb.h:28:0,
             from mypmtud.cc:23: /usr/include/netinet/in.h:239:8: error: previous definition of ‘struct sockaddr_in6’ In file included from mypmtud.cc:30:0: /usr/include/linux/in6.h:54:8: error: redefinition of ‘struct ipv6_mreq’ In file included from /usr/include/netdb.h:28:0,
             from mypmtud.cc:23: /usr/include/netinet/in.h:275:8: error: previous definition of ‘struct ipv6_mreq’ make: *** [mypmtud] Error 1

如何将linux/in6.h文件包含到我的代码中?我需要linux/in6.h定义IPV6_DONTFRAGsetsockopt()才能了解此选项。
我包括的所有其他头文件:
#include <iostream>
#include <fstream>
#include <string>

#include <unistd.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <sys/uio.h>

#include <sstream>
#include <ctype.h>
#include <signal.h>
#include <map>
#include <errno.h>

#include <sys/time.h>
#include <netdb.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <netinet/ip_icmp.h>

我在VirtualBox 4.2.6上运行Ubuntu 12.10。

最佳答案

看起来linux/in6.hnetdb.h名称冲突。如果您发现netdb.h中所需的所有名称都在linux/in6.h中,则可以删除该名称,您应该会很好。另外,再次阅读它会让我觉得它可能已经为您包含在netinet/in.h中。

编辑:

(来自下面的评论:)
然后让我为您分解错误消息:/usr/include/linux/in6.h:30:8: error: redefinition of ‘struct in6_addr’ In file included from /usr/include/netdb.h:28:0,即netdb.h中已经定义了'struct in6_addr'。接下来的netinet/in.h也提供了导致另一个冲突的结构。之后的所有事情都是关于在尝试包含netinet/in6.h的同时在netinet/in.h和netdb.h中都定义了一个结构。使用netdb.hlinux/in6.h的代码部分是否分开?如果是这样,请尝试其他文件。我认为对于不同的文件,您可能遇到的所有冲突都将被消除,因为每个文件都是一种 namespace (我在python的上下文中考虑 namespace )。我不确定这是100%,但是我稍后再检查。

08-28 12:40