You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

交叉编译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源码,具体步骤:

  1. 添加string.h头文件:
    打开../../libiberty/strerror.c,在现有头文件包含部分(比如#include <stdio.h>之后)添加:

    #include <string.h>
    
  2. 解决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定义属于冗余),但条件编译的方式更适配不同环境。

  3. 重新编译:
    修改后回到编译目录,重新执行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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 10:54:19