首页 > 其他分享 >为嵌入式板卡交叉编译gcc

为嵌入式板卡交叉编译gcc

时间:2025-01-22 20:10:33浏览次数:1  
标签:gcc gnu -- 嵌入式 aarch64 linux sysroot 板卡

需要提前准备什么?

  • 交叉编译器(以及相应的sysroot,可以通过xxx-gcc --print-sysroot来查看路径)
  • gcc源码,这里我用的是7.5.0版本的,也可以尝试别的 下载地址
  • binutils源码,光有gcc是不行的,还需要as才可以完成整个编译过程 下载地址

编译器路径

其实一般情况下我是比较建议直接使用交叉编译器的绝对路径的,但是在这个编译过程中出现过问题,因此将其加入环境变量

export PATH=/path/to/your/cross/compiler/bin/:$PATH

这里我用的是gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu,你的可能并不一样,请根据实际情况来修改

这里可以简单测试

which aarch64-linux-gnu-gcc # 确认该命令是否来自你所期望的路径
aarch64-linux-gnu-gcc -v # 确认命令执行正常

编译流程

目录组织

.
├── archive # 源码包
│   ├── binutils-2.35.tar.xz
│   └── gcc-7.5.0.tar.gz
├── build # 编译中间文件,在这里执行configure
│   ├── binutils
│   └── gcc
├── output # 最终输出路径,即prefix指向的位置
│   ├── binutils
│   ├── libc
│   └── gcc
└── src # 解压得到的源码
    ├── binutils-2.35
    └── gcc-7.5.0

交叉编译gcc

下载依赖

进入gcc源码目录(src/gcc-7.5.0),执行

contrib/download_prerequisites

需要看到

gmp-6.1.0.tar.bz2: OK
mpfr-3.1.4.tar.bz2: OK
mpc-1.0.3.tar.gz: OK
isl-0.16.1.tar.bz2: OK
All prerequisites downloaded successfully.

才算成功

编译

来到build目录(build/gcc-7.5.0),执行

CC=aarch64-linux-gnu-gcc \
CXX=aarch64-linux-gnu-g++ \
../../src/gcc-7.5.0/configure \
  --prefix=/your/path/to/output/gcc-7.5.0 \
  --target=aarch64-linux-gnu \
  --host=aarch64-linux-gnu \
  --build=x86_64-unknown-linux-gnu \
  --with-sysroot=/opt/build-env/libc \
  --with-build-sysroot=/your/path/to/cross/compiler/sysroot \
  --enable-languages=c,c++ \
  --disable-multilib \
  --enable-shared \
  --disable-libmudflap \
  --enable-threads=posix \
  --enable-nls \
  --with-gnu-as \
  --with-gnu-ld \
  --disable-libstdcxx-pch \
  --enable-c99 \
  --enable-clocale=gnu \
  --enable-libstdcxx-debug \
  --enable-long-long \
  --enable-gnu-indirect-function

注意点:

  • CCCXX根据实际情况进行设置
  • --host/--target/--build根据实际情况进行设置
  • --with-sysroot是指将来在板子上使用gcc时,它默认的查找sysroot的路径(注意,这个路径是板子上的路径,而且必须是绝对路径),如果不设置,可能会从/usr/include之类的地方查,如果你的板子并没有提供这些头文件,那么这个选项要仔细设置
  • --with-build-sysroot为编译时交叉编译器使用的sysroot,如果没有设置--with-sysroot,那么这个会使用默认的路径,不设置也可以;但如果设置了--with-sysroot,交叉编译器使用的sysroot也会被设置,因此这种情况下就需要设置本选项来指定,一般来说直接指定为前述--print-sysroot输出的路径即可

完成后,执行

make -j8

根据你自己的机器配置来决定到底是j几,编译之后执行

make install

完成gcc的交叉编译,此时就可以在output/gcc-7.5.0中找到编好的东西了

交叉编译binutils

这个比较简单

CC=aarch64-linux-gnu-gcc \
CXX=aarch64-linux-gnu-g++ \
../../src/binutils-2.35/configure \
  --prefix=/your/path/to/output/binutils-2.35 \
  --target=aarch64-linux-gnu \
  --host=aarch64-linux-gnu \
  --build=x86_64-unknown-linux-gnu \
  --enable-ld=yes
make -j8
make install

sysroot

如果你的板子没有提供头文件,那么你需要把先前--print-sysroot指定路径下的所有内容都放到编译gcc时--with-sysroot指定的路径下

使用

将前述3个项目内容都弄到板子上,这里建议打包之后再传,不然可能会导致权限、文件类型出现异常,尤其是经过Windows的情况

在板子上,你可以

  • 把前述内容放到usr下面,你可以注意一下目录名都是对得上的,这样不用配环境变量就可以在板子上直接使用
  • 在使用前配置gcc和binutils的环境变量,PATH指向两个bin目录,也是OK的

标签:gcc,gnu,--,嵌入式,aarch64,linux,sysroot,板卡
From: https://www.cnblogs.com/ippfcox/p/18686708

相关文章

  • 各嵌入式模块驱动整理
    stm32DHT11标准库和HAL库驱动代码DHT11标准库和HAL库驱动代码-CSDN博客旋转编码器驱动-标准库和HAL库旋转编码器驱动-标准库和HAL库-CSDN博客按键控制驱动-标准库和HAL库按键控制驱动-标准库和HAL库-CSDN博客电机驱动-标准库和HAL库电机驱动-标准库和HAL库-CSDN博客OL......
  • GD32F303 GCC 环境搭建
    一、引言在嵌入式开发领域,GD32F303微控制器以其出色的性能和丰富的功能被广泛应用。为了充分发挥其潜力,搭建一个高效的开发环境并深入理解项目构建过程至关重要。本文将详细介绍如何基于GCC工具链搭建GD32F303的开发环境,重点聚焦于Makefile文件的编写与解析,助力开发......
  • 国产化板卡设计原理图:2295-基于 JFM7K325T的半高PCIe x4双路万兆光纤收发卡
      基于JFM7K325T的半高PCIex4双路万兆光纤收发卡    一、板卡概述   板卡采用JFM7K325T芯片作为主处理器,可应用于万兆网络、高速数据采集、存储;光纤隔离网闸等领域。      二、功能和技术指标: 板卡功能参数内容......
  • 国产板卡设计原理图:2226-基于JFM7K325T PCIeX8 四路光纤卡
    一、板卡概述     板卡主芯片采用JFM7K325TFPGA,pin_to_pin兼容FPGAXC7K410T-2FFG900,支持8-LanePCIe、64bitDDR3、四路SFP+连接器、四路SATA接口、内嵌16个高速串行收发器RocketIOGTX,软件具有windows驱动。    二、功能和技术指标: 板卡功能参......
  • 面试必会(嵌入式)操作系统面试高频(三)线程与进程
    目录1.请你说说CPU工作原理⭐⭐2.死锁的原因、条件?以及如何预防⭐⭐⭐3.死锁与活锁⭐⭐死锁:活锁:解决活锁问题的一般策略包括:4.说说sleep和wait的区别?⭐⭐⭐sleep和wait的区别:5.简述epoll和select的区别,epoll为什么高效?⭐⭐⭐⭐epoll:Select:epoll为什么高效?拷贝开......
  • 面试必会(嵌入式)操作系统面试高频(一)线程与进程
    目录1.什么是线程?进程,线程,彼此有什么区别?⭐⭐⭐进程线程线程和进程区别:2.什么时候用进程,什么时候用线程?⭐⭐使用进程的情况:使用线程的情况:3.一个线程占多大内存?⭐⭐⭐4.说说什么是信号量,有什么作用?⭐⭐5.多进程内存共享可能存在什么问题?如何处理?⭐⭐⭐⭐⭐多进程内......
  • 国产化板卡设计资料:2270-VC709E 基于FMC接口的JFM7VX690T36 PCIeX8 接口卡
    VC709E基于FMC接口的JFM7VX690T36 PCIeX8接口卡    一、板卡概述    本板卡基于FPGAJFM7VX690T36芯片,支持PCIeX8、两组64bitDDR3容量8GByte,HPC的FMC连接器,板卡支持各种FMC子卡扩展。软件支持windows,Linux操作系统。       ......
  • 嵌入式工程师必学(70):ARM Context-M的Clock时钟
    概述:ARMCortex-M0是为微控制器应用设计的32位精简指令集计算(RISC)处理器。它是Cortex-M系列中最简单、最小的处理器之一,针对低成本、低功耗的嵌入式系统。Cortex-M0时钟速度决定了指令的执行速度,并最终限制了微控制器的性能。Cortex-M0是一个具有3级整数流水线的超标量流水线......
  • 嵌入式Linux系统学习记录10
    在C语言中,指针是一个非常重要的概念。指针是一个变量,它存储的是另一个变量的内存地址。理解指针的细节和注意事项对于编写高效、稳定的C语言程序至关重要。以下是C语言中指针的一些细节和注意事项:1. 指针的定义和初始化指针是用*来声明的,表示指向某种类型的变量。例......
  • 基于嵌入式系统的智能豆浆机设计与实现
    引言随着物联网(IoT)技术的快速发展,智能家居设备越来越普及。智能豆浆机作为家庭厨房电器中的一种重要产品,能够自动化地完成豆浆制作过程。与传统豆浆机相比,智能豆浆机不仅具备更加智能的操作体验,还能够通过手机应用进行远程控制,提供更多个性化的功能选择。本文将介绍基于嵌......