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

RISC-V GCC多库编译适配错误与依赖缺失问题求助

RISC-V GCC多库编译错误排查与解决

操作步骤与错误现象

第一次GCC配置及CoreMark编译错误

配置GCC的命令:

sudo ../configure   --prefix=/opt/riscv   --target=riscv32-unknown-elf   --disable-multilib   --with-multilib-generator="rv32gc_zicntr-ilp32d--;rv32g_zicntr-ilp32d--;rv32g_zicntr_zca_zcb_zcf_zcmp_zcmt-ilp32d--;rv32g_zicntr_zba_zbb_zbs-ilp32d--;rv32gc_zicntr_zba_zbb_zbs-ilp32d--;rv32g_zicntr_zca_zcb_zcf_zcmp_zcmt_zba_zbb_zbs-ilp32d--;rv32g_zicntr_zba_zbb_zbc_zbs-ilp32d--;rv32gc_zicntr_zba_zbb_zbc_zbs-ilp32d--;rv32g_zicntr_zca_zcb_zcf_zcmp_zcmt_zba_zbb_zbc_zbs-ilp32d--;"

使用该GCC编译CoreMark的命令:

riscv32-unknown-elf-gcc -O3 -march=rv32g_zicntr -mabi=ilp32d -Iicc500 -I. -DFLAGS_STR=\""-O3 -march=rv32g_zicntr -mabi=ilp32d   "\" -DITERATIONS=0  core_list_join.c core_main.c core_matrix.c core_state.c core_util.c icc500/core_portme.c -o ./coremark.riscv_rv32g_zicntr

触发错误:

riscv32-unknown-elf-gcc: fatal error: Cannot find suitable multilib set for '-march=rv32imafd_zicntr_zicsr_zifencei'/'-mabi=ilp32d'

注:使用rv32gc_*系列架构编译无此错误,但所有rv32g_*系列架构都会触发该错误。

第二次GCC配置及PK编译错误

重新配置GCC的命令:

sudo ../configure   --prefix=/opt/riscv   --target=riscv32-unknown-elf --with-arch=rv32g_zicntr --with-abi=ilp32d --disable-multilib

使用该GCC配置编译PK的命令:

../configure --prefix=/opt/riscv --host=riscv32-unknown-elf CFLAGS="-mcmodel=medlow -march=rv32g_zicntr -mabi=ilp32d""

触发错误:

checking for __gmpz_init in -lgmp... no
checking for mpfr_init in -lmpfr... no
checking for mpc_init2 in -lmpc... no

目标需求

编译包含以下指定架构多库的GCC:

rv32gc_zicntr-ilp32d--;
rv32g_zicntr-ilp32d--;
rv32g_zicntr_zca_zcb_zcf_zcmp_zcmt-ilp32d--;
rv32g_zicntr_zba_zbb_zbs-ilp32d--;
rv32gc_zicntr_zba_zbb_zbs-ilp32d--;
rv32g_zicntr_zca_zcb_zcf_zcmp_zcmt_zba_zbb_zbs-ilp32d--;
rv32g_zicntr_zba_zbb_zbc_zbs-ilp32d--;
rv32gc_zicntr_zba_zbb_zbc_zbs-ilp32d--;
rv32g_zicntr_zca_zcb_zcf_zcmp_zcmt_zba_zbb_zbc_zbs-ilp32d--;

错误分析与解决方法

第一个错误的原因与解决

  1. 错误原因:

    • 配置时同时指定--disable-multilib和--with-multilib-generator,两个参数冲突。--disable-multilib会关闭多库支持,导致定义的多库规则完全不生效。
    • GCC处理rv32g_zicntr时会自动展开为rv32imafd_zicntr_zicsr_zifencei,但多库被禁用后没有对应预编译库匹配,因此报错;rv32gc_*能正常工作是因为GCC默认包含该架构的单库支持。
  2. 解决方法:

    • 移除--disable-multilib参数,开启多库功能。正确的配置命令:
      sudo ../configure   --prefix=/opt/riscv   --target=riscv32-unknown-elf   --with-multilib-generator="rv32gc_zicntr-ilp32d--;rv32g_zicntr-ilp32d--;rv32g_zicntr_zca_zcb_zcf_zcmp_zcmt-ilp32d--;rv32g_zicntr_zba_zbb_zbs-ilp32d--;rv32gc_zicntr_zba_zbb_zbs-ilp32d--;rv32g_zicntr_zca_zcb_zcf_zcmp_zcmt_zba_zbb_zbs-ilp32d--;rv32g_zicntr_zba_zbb_zbc_zbs-ilp32d--;rv32gc_zicntr_zba_zbb_zbc_zbs-ilp32d--;rv32g_zicntr_zca_zcb_zcf_zcmp_zcmt_zba_zbb_zbc_zbs-ilp32d--;"
      
    • 重新编译GCC,确保所有指定多库生成。

第二个错误的原因与解决

  1. 错误原因:

    • PK配置命令末尾多了一个双引号,导致CFLAGS参数解析错误,配置脚本无法识别编译参数,进而找不到GMP、MPFR、MPC等依赖库。
    • 第二次GCC配置使用--disable-multilib,仅生成rv32g_zicntr单库,不符合多库目标,该配置本身无效。
  2. 解决方法:

    • 先使用修正后的多库GCC配置完成编译,再修正PK配置命令的引号错误:
      ../configure --prefix=/opt/riscv --host=riscv32-unknown-elf CFLAGS="-mcmodel=medlow -march=rv32g_zicntr -mabi=ilp32d"
      
    • 若仍找不到依赖库,可通过LDFLAGS指定库路径:
      ../configure --prefix=/opt/riscv --host=riscv32-unknown-elf CFLAGS="-mcmodel=medlow -march=rv32g_zicntr -mabi=ilp32d" LDFLAGS="-L/opt/riscv/lib"
      

验证步骤

  1. 重新编译GCC后,执行riscv32-unknown-elf-gcc -print-multi-lib查看多库列表,确认所有目标架构已包含。
  2. 再次编译CoreMark的rv32g_zicntr版本,验证错误消失。
  3. 使用正确命令配置PK,确认依赖库可被找到并完成编译。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 02:22:05