我有三个文件,比如 Ac 、 Bc 和 Cc,所有这些文件都是 #include common.h
在 common.h 中,我包含“sys/socket.h”并通过宏保护 common.h:
#ifndef __COMMON_H
#define __COMMON_H
// body of file goes here
#endif
当我编译代码时,我得到几个错误,如下所示
In file included from /usr/include/sys/socket.h:40,
from tcpperf.h:4,
from wrapunix.c:1:
/usr/include/bits/socket.h:425: error: conflicting types for 'recvmmsg'
/usr/include/bits/socket.h:425: note: previous declaration of 'recvmmsg' was here
In file included from /usr/include/sys/socket.h:40,
from tcpperf.h:4,
from wrapsock.c:1:
正如你所看到的 wrapunix.c 和 wrapsock.c,它们都包含 tcpperf.h,但 tcpperf.h 由宏保护,但 gcc 抱怨 recvmsg 被多次声明。我该如何解决这个问题?
更新:这是导致问题的 tcpperf.h 的标头
#ifndef _TCPPERF_H
#define _TCPPERF_H
#include <sys/types.h>
#include <sys/socket.h>
#include <time.h>
#include <regex.h>
#include <errno.h>
#include <sched.h>
#include <pthread.h>
#include <argp.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <linux/tcp.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <signal.h>
#include <sys/prctl.h>
#include <unistd.h>
#include <sys/wait.h>
#endif
可以通过向 gcc 提供“-combine -fwhole-program”标志来重现上述错误,例如
gcc -std=gnu99 -Wall -combine -fwhole-program -I。error.c wrapunix.c wrapsock.c file1.c file2.c -o file2 -lrt