用crosstool-ng 制作 Windows 上的 aarch64-linux-gnu 交叉编译器
crosstool-ng 官网链接https://crosstool-ng.github.io/docs/需要注意的是crosstool-ng不能以root身份运行否则会提示以下错误[ERROR] You must NOT be root to run crosstool-NG故下面的所有操作都不要在root下进行。当然如果非要用root运行的话也是可以的见本文最后的附注。在嵌入式开发中下面这种场景被称为 “加拿大交叉编译” (Canadian Cross)Build (构建平台):Ubuntu 24.04 (x86_64)Host (运行平台):Windows (x86_64)Target (目标凭他):ARM Linux这正式我们下面要编译的工具链。一、准备 Ubuntu 编译环境sudo apt update sudo sudo apt install -y autoconf gperf \ libncurses5-dev python3-dev texinfo help2man gawk \ libtool libtool-bin bison flex bzip2 build-essential \ automake make mingw-w64 gcc g g-mingw-w64 \ libncurses5-dev libgmp-dev libmpc-dev libmpfr-dev g-mingw-w64-x86-64-posix # 将 mingw 的 gcc 切换为 posix 版本 sudo update-alternatives --set x86_64-w64-mingw32-gcc /usr/bin/x86_64-w64-mingw32-gcc-posix # 将 mingw 的 g 切换为 posix 版本 sudo update-alternatives --set x86_64-w64-mingw32-g /usr/bin/x86_64-w64-mingw32-g-posix最后两行命令是用来切换线程模型的如果线程模型不切换为posix在编译gdb时会报类似错误 /usr/lib/gcc/x86_64-w64-mingw32/13-win32/include/c/bits/std_mutex.h:164:5: error: __gthread_cond_t does not name a type; did you mean __gthread_once_t?确认线程模型是否切换成功x86_64-w64-mingw32-g -v在输出的最后几行中找到Thread model:这一项。它现在必须显示为posix如果是win32则说明没切换成功。一些依赖的介绍build-essential包含libc、gcc、g、make、dpkg-dev等在编译和构建软件时常用的工具和库flex即Fast Lexical Analyzer Generator是一个可以生成文法分析程序的工具texinfomakeinfo通过单个源文件来生成在线信息和打印输出的文档系统help2man从程序输出自动生成简单的手册文档gawk一种查找替换文本工具libtool通用库支持脚本将使用动态库的复杂性隐藏在统一、可移植的接口中使用libtool的标准方法可以在不同平台上创建并调用动态库主要的一个作用是在编译大型软件的过程中解决了库的依赖问题将繁重的库依赖关系的维护工作承担下来从而释放了程序员的人力资源。libtool提供统一的接口隐藏了不同平台间库的名称的差异等细节生成一个抽象的后缀名为la高层库libxx.la其实是个文本文件并将该库对其它库的依赖关系都写在该la的文件中;bison一种通用解析器生成器它将带注释的上下文无关文法转换为使用LALR1解析器表的确定性LR或广义LRGLR解析器libncurses5-devncurses库提供了一个API允许开发者在文本终端下使用图形用户界面。二、下载并安装crosstool-nggit clone https://github.com/crosstool-ng/crosstool-ng.git cd crosstool-ng ./bootstrap ./configure --enable-local make make installa、编译安装等目录全用crosstool-ng的默认配置不做修改以减少配置步骤默认构建出来的交叉编译器在Home的x-tools文件夹中构建过程中自动下载的依赖包在Home的src文件夹中b、如果git clone https://github.com/crosstool-ng/crosstool-ng.git失败可以先将crosstool-ng手动下载好然后解压到crosstool-ng目录中三、配置./ct-ng menuconfig运行此命令后会打开配置面板配置以下关键项目Target options - Target Architecture: 选择 armTarget options - Endianness: 选择小端 Little endianTarget options -Bitness: 选择64-bit(这会将架构标识符从arm变为aarch64)Target options-Omit vendor part of the target tuple: 我们不需要额外的厂商字段所以勾选它这样就可以屏蔽厂商字段 (默认字段为unknown)Toolchain options - Tuples vendor string: 填写自定义厂商字段 (如填写stm, 编译出来则名为aarch64-stm-linux-gnu); 当Omit vendor part of the target tuple被勾选时不会看到这个选项Toolchain options-Tuples alias: 设置为aarch64-linux-gnu(这样你调用时只需输入aarch64-linux-gnu-gcc)Toolchain options -Type-Canadian (这很重要否则是没有Host system配置项的)toolchain type的介绍可以看这一页:https://crosstool-ng.github.io/docs/toolchain-types/Toolchain options-Build system:修改为x86_64-pc-linux-gnu(默认)Toolchain options-Host system:修改为x86_64-w64-mingw32(这是让它在 Windows 运行的关键)Toolchain options-Build static toolchain: 建议勾选Build static toolchain或确保 MinGW 的运行时库被包含在内否则在 Windows 上运行 gcc.exe 时可能会提示找不到libwinpthread-1.dllOperating System - Target OS: 选择 linuxOperating System - Version of Linux: 选择 5.4.302Binary utilities - Version of binutils: 版本选择最新的稳定版或者根据需求选择C-library - C library: 选择 glibcC compiler - Version of gcc: 选择15.2.0C compiler-C: 勾选Debug facilities: 勾选gdb其他设置保持默认或者根据需要进行调整四、构建./ct-ng build注意构建过程通常需要 30 分钟到 2 小时具体取决于你的机器性能和网速。编译完成后工具链默认保存在~/x-tools/x86_64-w64-mingw32,aarch64-linux-gnu/目录下。附以root身份运行crosstool-ng的方法出于安全性考虑crosstool-ng默认不能以root身份运行如果确定要在root下运行需要在配置中开启这一选项-- Paths and misc options -- [*] Try features marked as EXPERIMENTAL [*] Allow building as root user (READ HELP!) (NEW)在这一选项的HELP文档中可以看到crosstool-ng的作者极力反对用root运行│ CT_ALLOW_BUILD_AS_ROOT: │ │ │ │ You normally do *not* need to be root to build a toolchain using │ │ crosstool-NG. In fact, it is *VERY* dangerous to run as root, as │ │ crosstool-NG will, as part of the build process, remove a few │ │ directories. If anything goes wrong, running as root can ruin │ │ your host distribution. │ │ │ │ I cant stress it enough: DO NOT RUN AS ROOT !! │ │ │ │ Do not run as root, youve been warned. │ │ Do not come whining, if it nukes your host system. │ │ Do not come whining, if you lose any data. │ │ Do not run as root. │ │ │ │ Do not run as root, youve been warned. │ │ Do not come whining, if the Earth stops rotating. │ │ Do not come whining, if kittens are smashed. │ │ Do not run as root. │ │ │ │ Do not run as root, do not run as root! │ │ (ad libitum)
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2499761.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!