我有三个文件,例如A.c,B.c和C.c,它们全部包含#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
最佳答案
错误是“冲突的'recvmmsg'类型”,而不仅仅是重复的定义(如果相等则可以接受)。这意味着您的.c源代码收到两种不同版本的recvmmsg:一种是直接包含tcpperf.h,另一种是通过sys/socket.h包含。我相信您在包含路径的其他位置还有tcpperf.h的另一个版本,具有不同的(也许是较旧的版本)recvmmsg。
关于c - gcc编译时类型解析,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13923671/