gcc编译命令_RISCV GCC工具链编译安装

本文详细指导如何下载并编译RISC-V架构的GCC交叉编译器,包括riscv32-unknown-elf-gcc、riscv64-unknown-elf-gcc等不同版本,以及针对不同ABI和架构的配置和选择。涵盖裸机和Linux环境下的编译选项及新lib和glibc的选择。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

RISC-V GCC工具链编译安装

要学习riscv架构,首先第一步,要搞定riscv的gcc交叉编译器。下面就对riscv的gcc交叉编译器,进行详细的介绍。

riscv gcc工具下载

Riscv的gcc交叉编译器,以开源的方式托管在github上。链接如下:

https://github.com/riscv/riscv-gnu-toolchain

7303db2e237ccfdf2ebaed3f8c492854.png

该仓库,里面包含了一些子仓库。

使用以下这个命令,将所有仓库,都clone下来。

git clone --recursive https://github.com/riscv/riscv-gnu-toolchain

以下是各个仓库的github地址:

riscv-gcc

https://github.com/riscv/riscv-gcc

riscv-glibc

https://github.com/riscv/riscv-glibc

riscv-newlib

https://github.com/riscv/riscv-newlib

riscv-dejagnu

https://github.com/riscv/riscv-dejagnu

riscv-gdb

https://github.com/riscv/riscv-binutils-gdb.git

riscv-binutils

https://github.com/riscv/riscv-binutils-gdb.git

riscv-qemu

https://github.com/riscv/riscv-qemu.git

编译riscv gcc

下载完毕后,就要开始编译。首先在riscv-gnu-toolchain根目录下,创建build目录。用于编译riscv gcc。

riscv gcc可以编译成以下几个版本

  • riscv32-unknown-elf-gcc

  • riscv64-unknown-elf-gcc

  • riscv32-unknown-linux-gnu-gcc

  • riscv64-unknown-linux-gnu-gcc

  • riscv64-multilib-elf-gcc

  • riscv64-liunx-multilib-gcc

以下编译,是基于 riscv架构支持 imc三种指令集,来进行编译的。如果想要支持其他的指令集,只需要修改 —-with-arch选项。

1、riscv32-unknown-elf-gcc

执行以下命令:

../configure --prefix=/opt/riscv32 --with-arch=rv32imc --with-abi=xxxmake

—-mabi可以选择如下:

  • ilp32

  • ilp32f

  • ilp32d

编译完成后,在/opt/riscv/bin目录下,有riscv32-unknown-elf-gcc的所有工具。

44c259e563fa01d322acb3291274d02f.png

通过 riscv32-unknown-elf-gcc -v命令,可以得到该工具链的配置信息。

Using built-in specs.COLLECT_GCC=./riscv32-unknown-elf-gccCOLLECT_LTO_WRAPPER=/opt/riscv/libexec/gcc/riscv32-unknown-elf/8.2.0/lto-wrapperTarget: riscv32-unknown-elfConfigured with: /tools/riscv-gnu-toolchain-1/build/../riscv-gcc/configure --target=riscv32-unknown-elf --prefix=/opt/riscv --disable-shared --disable-threads --enable-languages=c,c++ --with-system-zlib --enable-tls --with-newlib --with-sysroot=/opt/riscv/riscv32-unknown-elf --with-native-system-header-dir=/include --disable-libmudflap --disable-libssp --disable-libquadmath --disable-libgomp --disable-nls --src=../../riscv-gcc --enable-checking=yes --disable-multilib --with-abi=ilp32 --with-arch=rv32imc 'CFLAGS_FOR_TARGET=-Os  -mcmodel=medlow' 'CXXFLAGS_FOR_TARGET=-Os  -mcmodel=medlow'Thread model: singlegcc version 8.2.0 (GCC)

可以看出:

--target=riscv32-unknown-elf:指定工具为riscv32-unknow-elf--prefix=/opt/riscv32:  指定工具生成的目录--enable-languages=c,c++:支持c,c++语言--with-newlib:  c运行库使用newlib--with-abi=ilp32:工具链支持的abi方式是ilp64--with-arch=rv32imc:  工具链支持的riscv架构是 rv64imc

在build目录下,有如下的文件夹和文件生成。

7cc95e3a68777b2dac251d4c657086bc.png

其中有newlib和newlib-nano,就表示c运行库,就是用的newlib以及newlib-nano。

2、riscv64-unknown-elf-gcc

该工具,针对于riscv64架构的编译器,使用的C运行库为newlib。执行以下命令:

../configure --prefix=/opt/riscv64 --with-arch=rv64imc --with-abi=xxxmake

—-with-abi可以选择如下:

  • lp64

  • lp64f

  • lp64d

编译完成后,在/opt/riscv64/bin目录下,有riscv64-unknown-elf-gcc的所有工具。

94ed37bfad4ae1a9dbde1077bb3ac02d.png

使用 riscv64-unknown-elf-gcc -v 命令,可以得到该工具链的配置信息。

Using built-in specs.COLLECT_GCC=./riscv64-unknown-elf-gccCOLLECT_LTO_WRAPPER=/opt/riscv64/libexec/gcc/riscv64-unknown-elf/8.2.0/lto-wrapperTarget: riscv64-unknown-elfConfigured with: /tools/riscv-gnu-toolchain-1/build/../riscv-gcc/configure --target=riscv64-unknown-elf --prefix=/opt/riscv64 --disable-shared --disable-threads --enable-languages=c,c++ --with-system-zlib --enable-tls --with-newlib --with-sysroot=/opt/riscv64/riscv64-unknown-elf --with-native-system-header-dir=/include --disable-libmudflap --disable-libssp --disable-libquadmath --disable-libgomp --disable-nls --src=../../riscv-gcc --enable-checking=yes --disable-multilib --with-abi=lp64 --with-arch=rv64imc 'CFLAGS_FOR_TARGET=-Os  -mcmodel=medlow' 'CXXFLAGS_FOR_TARGET=-Os  -mcmodel=medlow'Thread model: singlegcc version 8.2.0 (GCC)

可以看出:

--target=riscv64-unknown-elf:指定工具为riscv64-unknow-elf--prefix=/opt/riscv64:  指定工具生成的目录--enable-languages=c,c++:支持c,c++语言--with-newlib:  c运行库使用newlib--with-abi=lp64:工具链支持的abi方式是lp64--with-arch=rv64imc:  工具链支持的riscv架构是 rv64imc

在build目录下,有如下的文件夹和文件生成。

7cc95e3a68777b2dac251d4c657086bc.png

其中有newlib和newlib-nano,就表示c运行库,就是用的newlib以及newlib-nano。

3、riscv32-unknown-linux-gnu-gcc

该工具,针对于riscv32架构的编译器,使用的C运行库为linux中的标准glibc。执行以下命令:

../configure --prefix=/opt/riscv32-linux --with-arch=rv32imc --with-abi=xxx --enable-linuxmake linux

—-with-abi可以选择如下:

  • lp64

  • lp64f

  • lp64d

编译完成后,在/opt/riscv32-linux/bin目录下,有riscv32-unknown-linux-gnu-gcc的所有工具。

2dcab5710eb916cc3da4931ec1f3f989.png

使用 riscv32-unknown-linux-gnu-gcc -v 命令,可以得到该工具链的配置信息。

Using built-in specs.COLLECT_GCC=./riscv32-unknown-linux-gnu-gccCOLLECT_LTO_WRAPPER=/opt/riscv-linux/libexec/gcc/riscv32-unknown-linux-gnu/8.2.0/lto-wrapperTarget: riscv32-unknown-linux-gnuConfigured with: /tools/riscv-gnu-toolchain-1/build/../riscv-gcc/configure --target=riscv32-unknown-linux-gnu --prefix=/opt/riscv-linux --with-sysroot=/opt/riscv-linux/sysroot --with-newlib --without-headers --disable-shared --disable-threads --with-system-zlib --enable-tls --enable-languages=c --disable-libatomic --disable-libmudflap --disable-libssp --disable-libquadmath --disable-libgomp --disable-nls --disable-bootstrap --src=../../riscv-gcc --enable-checking=yes --disable-multilib --with-abi=ilp32 --with-arch=rv32imc 'CFLAGS_FOR_TARGET=-O2  -mcmodel=medlow' 'CXXFLAGS_FOR_TARGET=-O2  -mcmodel=medlow'Thread model: singlegcc version 8.2.0 (GCC)

可以看出:

--target=riscv32-unknown-linux-gnu:指定工具为riscv32-unknow-linux-gnu--prefix=/opt/riscv-linux:  指定工具生成的目录--enable-languages=c,c++:支持c,c++语言--with-abi=ilp32:工具链支持的abi方式是ilp32--with-arch=rv32imc:  工具链支持的riscv架构是 rv32imc

虽然有—-with-newlib配置选项,但是编译却不会有newlib编译,而有glibc编译。因为使用的是make linux进行编译。也可以在configure阶段,加上—-enable-linux选项。

在build目录下,有如下文件以及文件夹:

1cd52390ec8ea0237e7c2f5fd85578f6.png

可以看出,用的c运行库是glibc。

4、riscv64-unknown-linux-gnu-gcc

该工具,针对于riscv64架构的编译器,使用的C运行库为linux中的标准glibc。

执行以下命令:

../configure --prefix=/opt/riscv64-linux --with-arch=rv64imafdc --with-abi=xxx --enable-linuxmake linux

—-with-abi可以选择如下:

  • lp64

  • lp64f

  • lp64d

编译完成后,在/opt/riscv64-linux/bin目录下,有riscv64-unknown-linux-gnu-gcc的所有工具。

74004466587e34ebfd7ac15b8a8282fc.png

使用 riscv64-unknown-linux-gnu-gcc -v 命令,可以得到该工具链的配置信息。

Using built-in specs.COLLECT_GCC=./riscv64-unknown-linux-gnu-gccCOLLECT_LTO_WRAPPER=/opt/riscv64-linux/libexec/gcc/riscv64-unknown-linux-gnu/8.2.0/lto-wrapperTarget: riscv64-unknown-linux-gnuConfigured with: /tools/riscv-gnu-toolchain-1/build/../riscv-gcc/configure --target=riscv64-unknown-linux-gnu --prefix=/opt/riscv64-linux --with-sysroot=/opt/riscv64-linux/sysroot --with-newlib --without-headers --disable-shared --disable-threads --with-system-zlib --enable-tls --enable-languages=c --disable-libatomic --disable-libmudflap --disable-libssp --disable-libquadmath --disable-libgomp --disable-nls --disable-bootstrap --src=../../riscv-gcc --enable-checking=yes --disable-multilib --with-abi=lp64d --with-arch=rv64imafdc 'CFLAGS_FOR_TARGET=-O2  -mcmodel=medlow' 'CXXFLAGS_FOR_TARGET=-O2  -mcmodel=medlow'Thread model: singlegcc version 8.2.0 (GCC)

可以看出:

--target=riscv64-unknown-linux-gnu:指定工具为riscv64-unknow-linux-gnu--prefix=/opt/riscv64:  指定工具生成的目录--enable-languages=c,c++:支持c,c++语言--with-abi=lp64d:工具链支持的abi方式是lp64d--with-arch=rv64imafdc:  工具链支持的riscv架构是 rv64imafdc

虽然有—-with-newlib配置选项,但是编译却不会有newlib编译,而是有glibc编译。因为使用的是make linux进行编译。也可以在configure阶段,加上—-enable-linux选项。

在build目录下,有如下文件以及文件夹:

666c085c6988b790d7111dfee234e3bf.png

可以看出,用的c运行库是glibc。

5、riscv64-linux-multilib

在编译riscv工具链的时候,可以编译multilib版本的gcc,这样这个工具,可以同时支持32位和64位。

执行以下命令:

../configure --prefix=/opt/riscv-linux-multilib --enable-multilib --target=riscv64-linux-multilibmake linux

332f518ef21e2a086422df710eba853f.png

编译完成后,在/opt/riscv64-linux/bin目录下,有riscv64-linux-multilib -gcc的所有工具。

虽然有通过—-target指定,但是生成的工具链名字还是riscv64-unknow-linu-gnu-gcc。

使用 riscv64-unknown-linux-gnu-gcc -v 命令,可以得到该工具链的配置信息。

Using built-in specs.COLLECT_GCC=./riscv64-unknown-linux-gnu-gccCOLLECT_LTO_WRAPPER=/opt/riscv-multilib/libexec/gcc/riscv64-unknown-linux-gnu/8.2.0/lto-wrapperTarget: riscv64-unknown-linux-gnuConfigured with: /tools/riscv-gnu-toolchain-1/build/../riscv-gcc/configure --target= riscv64-linux-multilib --prefix=/opt/riscv-linux-multilib --with-sysroot=/opt/riscv-linux-multilib/sysroot --with-newlib --without-headers --disable-shared --disable-threads --with-system-zlib --enable-tls --enable-languages=c --disable-libatomic --disable-libmudflap --disable-libssp --disable-libquadmath --disable-libgomp --disable-nls --disable-bootstrap --src=../../riscv-gcc --enable-checking=yes --enable-multilib --with-abi=lp64d --with-arch=rv64imafdc 'CFLAGS_FOR_TARGET=-O2  -mcmodel=medlow' 'CXXFLAGS_FOR_TARGET=-O2  -mcmodel=medlow'Thread model: single

可以看出:

--target= riscv64-linux-multilib:指定工具为riscv64-linux-multilib--prefix=/opt/riscv-linux-multilib:  指定工具生成的目录--enable-languages=c,c++:支持c,c++语言--with-abi=lp64d:工具链支持的abi方式是lp64d--with-arch=rv64imafdc:  工具链支持的riscv架构是 rv64imafdc--enabl-multilib: 启动 multilib

对于riscv64-linux-multilib-gcc编译器,可以通过以下选项,来决定生成的程序是32位版本还是64位版本:

-march=rv32 : 32位版本-march=rv64 : 64位版本

6、riscv64-multilib-elf-gcc

在裸机编译riscv工具链的时候,可以编译multilib版本的gcc,这样这个工具,可以同时支持32位和64位。

执行以下命令:

../configure --prefix=/opt/riscv64-multilib-elf --enable-multilib --target=riscv64-multilib-elfmake

编译完成后,在/opt/ riscv64-multilib-elf /bin目录下,有riscv64-multilib-elf-gcc的所有工具。使用make命令,就可以生成了。

feac44c63dd46cccd332bce0cdccc6ce.png

虽然有使用–target指定,但是生成的编译器还是riscv64-unknown-elf-gcc。

使用 riscv64-unknown-elf-gcc -v 命令,可以得到该工具链的配置信息。

Using built-in specs.COLLECT_GCC=./riscv64-unknown-elf-gccCOLLECT_LTO_WRAPPER=/opt/riscv64-multilib-elf/libexec/gcc/riscv64-unknown-elf/8.2.0/lto-wrapperTarget: riscv64-unknown-elfConfigured with: /tools/riscv-gnu-toolchain-1/build/../riscv-gcc/configure --target=riscv64-multilib-elf --prefix=/opt/riscv64-multilib-elf --disable-shared --disable-threads --disable-tls --enable-languages=c,c++ --with-system-zlib --with-newlib --with-sysroot=/opt/riscv64-multilib-elf/riscv64-unknown-elf --disable-libmudflap --disable-libssp --disable-libquadmath --disable-libgomp --disable-nls --src=../../riscv-gcc --enable-checking=yes --enable-multilib --with-abi=lp64d --with-arch=rv64imafdc 'CFLAGS_FOR_TARGET=-Os  -mcmodel=medlow' 'CXXFLAGS_FOR_TARGET=-Os  -mcmodel=medlow'Thread model: singlegcc version 8.2.0 (GCC)

可以看出:

--target=riscv64-multilib-elf:指定工具为riscv64-multilib-elf--prefix=/opt/riscv64-multilib-elf:  指定工具生成的目录--enable-languages=c,c++:支持c,c++语言--with-abi=lp64d:工具链支持的abi方式是lp64d--with-arch=rv64imafdc:  工具链支持的riscv架构是 rv64imafdc--enable-multilib:  启用multilib

对于riscv64-multilib-elf-gcc编译器,可以通过以下选项,来决定生成的程序是32位版本还是64位版本:

-march=rv32 : 32位版本-march=rv64 : 64位版本

riscv-none-embed-gcc

专门为嵌入式使用的gcc交叉编译工具链。官方网站:

https://gnu-mcu-eclipse.github.io/toolchain/riscv/

可以直接下载linux的二进制执行程序,以及windows的安装包。这个一般要搭配GNU MCU eclipse工具一起使用。

因为这个工具,直接提供执行程序,因此就不介绍了。

总结

riscv的gcc编译器,分为2大类:

  • 裸机:unknown-elf,none-embed

  • linux:linux

除了non-embed编译器,对于每一类,如果禁用multilib,那么又分为32位版本和64位版本。如果使能multilib,那么就只有一个版本,但是这个版本工具,可以同时支持32位和64位。

ce8550a50e00f2d6f738abc22e11f486.png

RISC-V中文社区致力于RISC-V技术的推广,为广大RISC-V爱好者提供一个交流学习的开放平台。社区长期欢迎您以各种方式来与我们互动。

往期精彩回顾国产RISC-V开发板RV-STAR初体验放假不忘学习--蜂鸟E203开发实战RISC-V处理器设计课程(7)低功耗机制与可扩展协处理器RISC-V处理器设计系列课程(6)蜂鸟E203异常与中断RISC-V处理器设计系列课程(5)蜂鸟E203存储器架构RISC-V处理器设计课程(4)蜂鸟E203指令流水线设计RISC-V处理器设计系列课程(3)蜂鸟E203设计概况RISC-V处理器设计系列课程(2)RISC-V架构基础RISC-V处理器设计系列课程(1)CPU基础知识扫码入群讨论扫码添加管理员微信请备注“申请进群”05051154a837d5a09ea04d0445838008.pngbaba66553f0fa4300d68b31b3e556172.png03fdf2b3646a54a607213a872f233b46.pngbcdf6821211b51dd1cdbf1539d9b6834.png17e1ca6d4bf0ba27483e27430996e324.png

604e5443f0baa27d50b089ce7dbd872f.png
### RISC-V Nuclei 编译工具链安装配置 对于RISC-V架构下的Nuclei处理器系列,其编译工具链的构建主要依赖于`riscv-gnu-toolchain`这一开源项目。为了成功建立适用于Nuclei平台的开发环境,需遵循一系列特定的操作流程。 #### 下载并初始化仓库 从GitHub克隆官方维护的RISC-V GNU工具链仓库是一个常见的起点[^2]: ```bash git clone --recursive https://github.com/riscv/riscv-gnu-toolchain.git cd riscv-gnu-toolchain ``` 考虑到网络条件可能影响到子模块同步的速度甚至成功率,建议寻找国内镜像站点作为替代方案来加速资源获取过程[^4]。 #### 准备必要的软件包 确保宿主机已准备好所有必需的支持库与工具集,这一步骤通常涉及通过包管理器安装多个组件。针对Ubuntu操作系统而言,执行如下命令可以满足需求: ```bash sudo apt-get update && sudo apt-get install -y \ autoconf automake autotools-dev curl python3 libmpc-dev \ libmpfr-dev libgmp-dev gawk build-essential bison flex texinfo \ gperf libtool patchutils bc zlib1g-dev libexpat-dev ``` #### 配置与编译 进入之前创建的工作目录后,运行configure脚本来指定目标路径及其他参数设置。对于支持RV32GC指令集且采用ILP32D ABI标准的情况,可参照下面的例子进行调整[^3]: ```bash mkdir -p build && cd build ../configure --prefix=/opt/riscv --with-arch=rv32gc --with-abi=ilp32d make -j$(nproc) ``` 值得注意的是,默认情况下此操作会尝试构建完整的Linux内核及用户空间程序所需的全部工具集合(`linux`);如果仅关注裸机应用,则可以选择只生成基础的新库版本(`newlib`)以节省时间和磁盘空间消耗。 #### 测试验证 完成上述步骤之后,应该能够获得一套功能完备的交叉编译套件。可以通过简单测试案例确认新安装好的工具能否正常工作: ```bash echo 'int main(){}' | /opt/riscv/bin/riscv64-unknown-linux-gnu-gcc - ``` 以上即为围绕着RISC-V Nuclei所展开的一般性编译工具链部署指导概览。具体细节可能会依据实际应用场景有所变化,请参阅官方文档获取最权威的信息来源。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值