如何在预构建ARM GCC工具链下重建带--disable-newlib-mb的newlib?
问题解答
能不能在预构建工具链里改配置重建newlib?
不行。你用的ARM官网预构建工具链只提供编译完成的二进制文件,没有附带对应版本的完整构建脚本、定制化补丁和依赖源码,没法直接修改newlib的配置标志并重新编译。就算你自己找通用newlib源码编译,也大概率和现有工具链的其他组件不兼容——ARM官方的GCC工具链会添加一些私有补丁,这些补丁不会随预构建包公开。
从头构建ARM GCC工具链的靠谱方法
最省心的方案是用crosstool-NG,这个工具专门用于定制交叉编译工具链,能灵活调整newlib这类组件的编译选项,具体步骤如下:
- 安装系统依赖:Debian/Ubuntu系直接执行以下命令,其他发行版对应查找包名即可
apt install git make gcc g++ libncurses-dev libssl-dev bison flex - 拉取crosstool-NG源码:
git clone https://github.com/crosstool-ng/crosstool-ng.git cd crosstool-ng - 切换到支持GCC 12.2的稳定分支:
git checkout crosstool-ng-1.25.0 - 编译安装crosstool-NG:
./bootstrap ./configure --prefix=/usr/local make make install - 初始化ARM none-eabi的模板配置:
ct-ng arm-none-eabi - 进入图形配置界面:
ct-ng menuconfig - 定制newlib和GCC参数:
- 找到
C-library->newlib选项,开启Customize newlib configure flags,在输入框中添加--disable-newlib-mb - 转到
C-compiler模块,确认GCC版本设置为12.2,启用C编译器,并将C标准指定为c++20
- 找到
- 启动工具链构建:
构建完成后,工具链会生成在ct-ng build~/x-tools/arm-none-eabi/目录下,将该路径添加到系统PATH环境变量即可使用。
至于你试过的Linaro ABE,它的封装程度太高,无法单独修改newlib的配置参数,灵活性远不如crosstool-NG。如果非要基于Linaro代码构建,只能手动拉取Linaro GCC的源码仓库,自行修改newlib的配置脚本后从头编译,但步骤会繁琐很多,不推荐。
内容的提问来源于stack exchange,提问作者prz
相关产品推荐
相关产品推荐

