交叉编译GNU Binutils 2.7 for PPC时遇编译错误求助
交叉编译Binutils 2.7 for PPC时的编译错误解决
问题背景
交叉编译GNU Binutils 2.7到PPC架构,使用的交叉编译器是powerpc-linux-gnu-gcc 9.1.0,配置命令:
../configure --host=powerpc-*-linux --prefix=~/Downloads/build/binutils-2.7/build/bin
设置的环境变量:
export CC="/usr/bin/powerpc-linux-gnu-gcc" export LD="/usr/bin/powerpc-linux-gnu-ld" export OBJCOPY="/usr/bin/powerpc-linux-gnu-objcopy"
编译时出现以下错误:
../../libiberty/strerror.c:458:12: error: static declaration of 'sys_nerr' follows non-static declaration 458 | static int sys_nerr; | ^~~~~~~~ In file included from /usr/powerpc-linux-gnu/include/stdio.h:781, from ../../libiberty/strerror.c:19: /usr/powerpc-linux-gnu/include/bits/sys_errlist.h:26:12: note: previous declaration of 'sys_nerr' was here 26 | extern int sys_nerr; | ^~~~~~~~ ../../libiberty/strerror.c:459:21: error: conflicting types for 'sys_errlist' 459 | static const char **sys_errlist; | ^~~~~~~~~~~ In file included from /usr/powerpc-linux-gnu/include/stdio.h:781, from ../../libiberty/strerror.c:19: /usr/powerpc-linux-gnu/include/bits/sys_errlist.h:27:26: note: previous declaration of 'sys_errlist' was here 27 | extern const char *const sys_errlist[]; | ^~~~~~~~~~~ ../../libiberty/strerror.c: In function 'strtoerrno': ../../libiberty/strerror.c:772:9: warning: implicit declaration of function 'strcmp' [-Wimplicit-function-declaration] 772 | (strcmp (name, error_names[errnoval]) == 0)) | ^~~~~~ make[1]: *** [Makefile:153: strerror.o] Error 1
问题原因
这不是配置或环境变量的问题,核心是新旧版本的兼容性冲突:
- Binutils 2.7是1996年的老旧版本,当时系统头文件未全局声明
sys_nerr和sys_errlist,因此源码自行定义了static版本;但现代交叉编译工具链的头文件(如bits/sys_errlist.h)已将这两个变量声明为extern,导致重复声明冲突。 strcmp的隐式声明是因为老版本源码未包含string.h头文件,而现代编译器默认开启了严格的隐式函数声明检查。
解决方案
必须修改libiberty/strerror.c源码,具体步骤:
添加
string.h头文件:
打开../../libiberty/strerror.c,在现有头文件包含部分(比如#include <stdio.h>之后)添加:#include <string.h>解决
sys_nerr和sys_errlist的声明冲突:
找到源码中第458-459行的static声明:static int sys_nerr; static const char **sys_errlist;将其替换为条件编译,避免与系统头文件的声明冲突:
#ifndef sys_nerr static int sys_nerr; #endif #ifndef sys_errlist static const char **sys_errlist; #endif也可以直接注释掉这两行(系统已提供extern声明,老代码的static定义属于冗余),但条件编译的方式更适配不同环境。
重新编译:
修改后回到编译目录,重新执行make即可。
补充说明
如果不想修改源码,可尝试在configure时添加编译选项禁用相关警告(不推荐,可能引发潜在问题):
../configure --host=powerpc-*-linux --prefix=~/Downloads/build/binutils-2.7/build/bin CFLAGS="-Wno-implicit-function-declaration -Wno-conflicting-types"
但修改源码是更彻底的解决方案,符合你之前处理交叉编译器错误的思路。
内容的提问来源于stack exchange,提问作者user1237916231
相关产品推荐
相关产品推荐

