i686-elf GCC交叉编译中无关联文件的声明错误求助
解决i686-elf交叉编译中sys/_types.h与bits/types.h的声明冲突
下面是几种针对性的排查和解决方法,按优先级尝试:
调整头文件包含顺序
交叉编译场景下,这两个头文件的间接包含顺序很容易出问题。如果你的代码或依赖库先引入bits/types.h再引入sys/_types.h,就可能触发重复声明。直接修改包含逻辑,让sys/_types.h先被加载——它本来就是对底层类型的封装层,bits/types.h作为实现细节应该靠后引入。给重复的类型声明加条件编译
打开你的sys/_types.h和bits/types.h,搜索报错的重复类型(比如int32_t、__size_t这类)。如果两个文件里都有同一个类型的typedef,在其中一个文件的声明块外面套上条件编译:#ifndef _INT32_T_DEFINED #define _INT32_T_DEFINED typedef int int32_t; #endif用独有的宏名确保类型只被定义一次。
检查交叉编译的头文件路径配置
别让编译器误加载宿主系统的头文件!编译时一定要用--sysroot参数指定目标架构的根目录,比如:gcc -target i686-elf --sysroot=/your/i686-elf/sysroot your_code.c或者在Makefile的
CFLAGS里加上这个参数,避免宿主系统的sys/_types.h和目标架构的版本冲突。给自定义头文件加保护宏
如果这两个头文件是你自己编写的,大概率是没加头文件保护。给每个文件开头加上:
(sys/_types.h)#ifndef SYS__TYPES_H #define SYS__TYPES_H // 所有头文件内容放这里 #endif // SYS__TYPES_H(bits/types.h)
#ifndef BITS_TYPES_H #define BITS_TYPES_H // 所有头文件内容放这里 #endif // BITS_TYPES_H彻底避免重复包含导致的多次声明。
内容的提问来源于stack exchange,提问作者Kazuala
相关产品推荐
相关产品推荐

