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

编译RISC-V架构GCC编译器报错,寻求问题排查方案

编译RISC-V目标GCC时的汇编器标志错误及后续问题

编译环境与配置

主机无网络,已本地编译好GCC依赖库,自定义CPP_FLAGS修改时钟设置,环境变量如下:

PREFIX=/nobackup/builddir
CPP_FLAGS="-D_GLIBCXX_USE_CLOCK_MONOTONIC=1 -D_GLIBCXX_USE_CLOCK_REALTIME=1
LD_LIBRARY_PATH=$PREFIX/mpc/lib:$PREFIX/mpfr/lib:$PREFIX/gmp/lib:$PREFIX/isl/lib
C_INCLUDE_PATH=$PREFIX/mpc/include:$PREFIX/mpfr/include:$PREFIX/gmp/include:$PREFIX/isl/include

configure命令:

../gcc-13.2.0/configure --target=riscv64-unknown-elf --with-gmp=$PREFIX/gmp 
--with-mpfr=$PREFIX/mpfr --with-mpc=$PREFIX/mpc --with-isl=$PREFIX/isl --disable-shared --enable-static 
--disable-multilib --prefix=$PREFIX/riscv64-unknown-elf --enable-languages=all

编译错误情况

configure执行无报错,但make接近完成时出现汇编器错误:

/nobackup/builddir/build/./gcc/as: 114: exec: -march=rv64imafdc_zicsr: not found
../../gcc-13.2.0/gcc/m2/Make-lang.in:1586: recipe for target '/nobackup/builddir/build/gcc/m2/gm2-libs-corou
tines/SYSTEM.def' failed
make[2]: *** [/nobackup/builddir/build/gcc/m2/gm2-libs-coroutines/SYSTEM.def] Error 1

/nobackup/builddir/build/./gcc/as: 114: exec: -march=rv64imafdc_zicsr: not found
../../gcc-13.2.0/gcc/m2/Make-lang.in:1568: recipe for target '/nobackup/builddir/build/gcc/m2/gm2-libs/SYSTEM
.def' failed
make[2]: *** [/nobackup/builddir/build/gcc/m2/gm2-libs/SYSTEM.def] Error 1

rm m2/gm2-compiler-boot/P0SyntaxCheck.mod m2/gm2-compiler-boot/PCBuild.mod gccgo.pod gforttran.pod gcc.pod 
m2/gm2-compiler-boot/P1Build.mod m2/gm2-compiler-boot/P2Build.mod m2/gm2-compiler-boot/P3Build.mod 
m2/gm2-compiler-boot/PHBuild.mod

make[2]: Leaving directory '/nobackup/builddir/build/gcc'
Makefile:4619: recipe for target 'all-gcc' failed
make[1]: *** [all-gcc] Error 2
make[1]: Leaving directory '/nobackup/builddir/build'
Makefile:1036: recipe for target 'all' failed

改用单线程编译后出现新错误:

Makefile:1157: update target 'gcc-main.o' due to ../../gcc-13.2.0/gcc/gcc-main.cc
g++ -fno-PIE -c   -g -O2    -DIN_GCC  -DCROSS_DIRECTORY_STRUCTURE   -fno-exceptions 
-fno-rtti -fasynchronous-unwind-tables -W -Wall -Wno-narrowing-Wwrite-strings 
-Wcast-qual -Wmissing-format-attribute -Wconditionally-supported ... -DHAVE_CONFIG_H 
-I. -I. -I../../gcc-13.2.0/gcc -I../../gcc-13.2.0/gcc/. -I../../gcc-13.2.0/gcc/. 
-I../../gcc-13.2.0/gcc/../include -I../../gcc-13.2.0/gcc/../libcpp/include 
-I../../gcc-13.2.0/gcc/../libcody -I/nobackup/builddir/gmp/include 
-I/nobackup/builddir/mpfr/include -I/nobackup/builddir/mpc/include 
-I../../gcc-13.2.0/gcc/../libdecnumber -I../../gcc-13.2.0/gcc/../libdecnumber/dpd 
-I../libdecnumber -I../../gcc-13.2.0/gcc/../libbacktrace -I/nobackup/builddir/isl/include 
-D_GLIBCXX_USE_CLOCK_MONOTONIC=1 -D_GLIBCXX_USE_CLOCK_REALTIME=1 -o gcc-main.o -MT 
gcc-main.o -MMD -MP -MF ./.deps/gcc-main.TPo ../../gcc-13.2.0/gcc/gcc-main.cc
mv ./.deps/gcc-main.TPo ./.deps/gcc-main.Po



../../gcc-13.2.0/gcc/m2/Make-lang.in:1542: target 'm2/gm2config.aci' does not exist
NEW_SRCDIR=`../../gcc-13.2.0/gcc/m2/tools-src/calcpath ../ ../../gcc-13.2.0/gcc m2` ; \
        export NEW_SRCDIR ; \
cd m2 ; \
if echo -DIN_GCC  -DCROSS_DIRECTORY_STRUCTURE | grep \\\-DCROSS_DIRECTORY_STRUCTURE; then \
    AR= ; \
    export AR ; \
    RANLIB ; \
    exprot RANLIB ; \
    /bin/bash -c '${NEW_SRCDIR}/configure --srcdir=${NEW_SRCDIR} \
        --target=riscv64-unknown-elf --program-suffix= \
        --includedir=`echo /nobackup/builddir/riscv64-unknown-elf/lib/gcc/riscv64-unknown
            -elf/13.2.0/../../../../riscv64-unknown-elf/sys-include | sed -e :a -e 
            's,[^/]*/\\.\\./,,' -e ta` --libdir=/nobackup/builddir/riscv64-unknown-elf/lib \
        --libexecdir=/nobackup/builddir/riscv64-unknown-elf/libexec' ; \
    else \
        /bin/bash -c '${NEW_SRCDIR}/configure --srcdir= \
            --target=riscv64-unknown-elf --program-suffix=' ; \
    fi
/nobackup/builddir/build/gcc/m2
-DIN_GCC -DCROSS_DIRECTORY_STRUCTURE
/bin/bash: /nobackup/builddir/build/gcc/m2: Is a directory
../../gcc-13.2.0/gcc/m2/Make-lang.in:1542: recipe for target 'm2/gm2config.aci' failed
make[2]: *** [m2/gm2config.aci] Error 126

疑问:编译GCC不需要手动提供-march标志,是否遗漏了什么配置?


解决方案

1. 修复环境变量配置错误

第一个错误的本质是GCC调用汇编器时,把架构标志当成了可执行文件路径,根源是你设置的CPP_FLAGS未正确闭合引号,导致LD_LIBRARY_PATH和C_INCLUDE_PATH被误纳入CPP_FLAGS参数,引发解析混乱。正确的环境变量设置应该是:

PREFIX=/nobackup/builddir
export CPP_FLAGS="-D_GLIBCXX_USE_CLOCK_MONOTONIC=1 -D_GLIBCXX_USE_CLOCK_REALTIME=1"
export LD_LIBRARY_PATH="$PREFIX/mpc/lib:$PREFIX/mpfr/lib:$PREFIX/gmp/lib:$PREFIX/isl/lib"
export C_INCLUDE_PATH="$PREFIX/mpc/include:$PREFIX/mpfr/include:$PREFIX/gmp/include:$PREFIX/isl/include"

每个变量单独定义并export,确保引号完全闭合,避免参数串扰。

2. 缩小编译语言范围

错误集中在Modula-2语言模块(gm2相关),如果你不需要该语言支持,可在configure时指定实际需要的语言,跳过该模块编译:

../gcc-13.2.0/configure --target=riscv64-unknown-elf --with-gmp=$PREFIX/gmp \
--with-mpfr=$PREFIX/mpfr --with-mpc=$PREFIX/mpc --with-isl=$PREFIX/isl --disable-shared --enable-static \
--disable-multilib --prefix=$PREFIX/riscv64-unknown-elf --enable-languages=c,c++,fortran

3. 清理重建编译环境

  • 删除现有build目录,创建全新的空build目录
  • 重新设置正确的环境变量
  • 重新运行configure和make命令

4. 单线程编译错误的说明

单线程时出现的目录调用错误,同样是环境变量解析混乱+Modula-2模块配置脚本问题导致,按照上述步骤处理后即可解决。


内容的提问来源于stack exchange,提问作者prz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 17:05:53