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--;
错误分析与解决方法
第一个错误的原因与解决
错误原因:
- 配置时同时指定
--disable-multilib和--with-multilib-generator,两个参数冲突。--disable-multilib会关闭多库支持,导致定义的多库规则完全不生效。 - GCC处理
rv32g_zicntr时会自动展开为rv32imafd_zicntr_zicsr_zifencei,但多库被禁用后没有对应预编译库匹配,因此报错;rv32gc_*能正常工作是因为GCC默认包含该架构的单库支持。
- 配置时同时指定
解决方法:
- 移除
--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,确保所有指定多库生成。
- 移除
第二个错误的原因与解决
错误原因:
- PK配置命令末尾多了一个双引号,导致
CFLAGS参数解析错误,配置脚本无法识别编译参数,进而找不到GMP、MPFR、MPC等依赖库。 - 第二次GCC配置使用
--disable-multilib,仅生成rv32g_zicntr单库,不符合多库目标,该配置本身无效。
- PK配置命令末尾多了一个双引号,导致
解决方法:
- 先使用修正后的多库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"
- 先使用修正后的多库GCC配置完成编译,再修正PK配置命令的引号错误:
验证步骤
- 重新编译GCC后,执行
riscv32-unknown-elf-gcc -print-multi-lib查看多库列表,确认所有目标架构已包含。 - 再次编译CoreMark的
rv32g_zicntr版本,验证错误消失。 - 使用正确命令配置PK,确认依赖库可被找到并完成编译。
内容的提问来源于stack exchange,提问作者Shane Xu
相关产品推荐
相关产品推荐

