Windows10下为Cortex M0+编译启用异常的newlib-nano及libstdc++(nano 8.3.1)
我刚好帮过几个朋友处理过类似的newlib-nano异常支持问题,结合你用的ARM GCC 8.3.1工具链和Windows环境,给你一步步捋清楚操作流程,全程都是新手友好的步骤,哪怕你从没编译过ARM库也能跟着走:
前提准备:先搭好基础环境
首先得把必要的工具和环境搭好,这些都是一次性操作:
- 下载并安装ARM GCC 8.3.1工具链(选Windows版本,比如
gcc-arm-none-eabi-8-2019-q3-update-win32.exe),记住安装路径,后面要用到 - 安装MSYS2(Windows下编译ARM库需要类Unix环境,直接用CMD会踩很多依赖坑),安装后打开
MSYS2 Mingw64终端 - 提前确认网络正常,需要拉取对应版本的源码
步骤1:获取对应版本的源码
源码版本必须和你的8.3.1工具链严格匹配,不然编译出来的库会和现有工具链不兼容:
- 打开MSYS2终端,先创建一个工作目录:
mkdir ~/arm-lib-build && cd ~/arm-lib-build - 拉取newlib-nano源码并切换到8.3.1对应tag:
git clone https://github.com/ARM-software/newlib-nano.git cd newlib-nano && git checkout gcc-arm-8.3-2019.03 - 回到工作目录,拉取GCC源码(libstdc++是GCC的一部分)并初始化子模块:
cd .. && git clone https://github.com/gcc-mirror/gcc.git cd gcc && git checkout gcc-8_3_1-release git submodule update --init --recursive
步骤2:配置编译环境
- 在MSYS2终端安装编译依赖:
pacman -S make autoconf automake libtool bison flex texinfo - 把ARM GCC工具链的
bin目录加到系统PATH(替换成你自己的安装路径):export PATH="/c/Program Files (x86)/GNU Tools ARM Embedded/8 2019-q3-update/bin:$PATH" - 验证工具链是否生效,执行后能显示8.3.1版本就没问题:
arm-none-eabi-gcc --version
步骤3:编译带异常支持的newlib-nano
这一步是核心,重点是开启异常编译选项:
- 回到newlib-nano目录,创建编译输出目录:
cd ~/arm-lib-build/newlib-nano mkdir build && cd build - 执行配置命令(注意替换
--prefix后的输出路径为你自己的目标路径,比如/c/arm-nano-with-exceptions):../configure \ --target=arm-none-eabi \ --prefix=/c/arm-nano-with-exceptions \ --enable-newlib-nano-malloc \ --enable-newlib-reent-small \ --disable-newlib-fvwrite-in-streamio \ --disable-newlib-fseek-optimization \ --disable-newlib-wide-orient \ --enable-newlib-nano-formatted-io \ --enable-exceptions \ # 核心:开启C异常支持 --enable-cxx-exceptions \ # 核心:开启C++异常支持 --with-cpu=cortex-m0plus \ # 适配你的Cortex-M0+芯片 --with-mode=thumb - 开始编译(
-j$(nproc)用CPU全部核心加速,嫌慢可以改成-j4):make -j$(nproc) - 安装编译好的库到指定路径:
make install
步骤4:编译适配的nano版libstdc++
libstdc++需要基于刚才编译的newlib-nano来构建,确保兼容性:
- 回到GCC源码目录,创建编译目录:
cd ~/arm-lib-build/gcc mkdir build && cd build - 执行配置命令(
--prefix要和newlib-nano的输出路径一致):../configure \ --target=arm-none-eabi \ --prefix=/c/arm-nano-with-exceptions \ --enable-languages=c++ \ --disable-libstdcxx-pch \ --disable-libstdcxx-verbose \ --enable-libstdcxx-nano \ # 启用nano轻量化版本 --enable-exceptions \ --enable-cxx-exceptions \ --with-newlib \ --with-cpu=cortex-m0plus \ --with-mode=thumb \ --with-system-zlib=no \ --disable-shared \ --enable-static - 只编译libstdc++模块(不用编译整个GCC,省时间):
make -j$(nproc) all-target-libstdc++-v3 - 安装libstdc++:
make install-target-libstdc++-v3
步骤5:在MCUXpresso中使用新库
编译完成后,把新库集成到你的项目里:
- 打开MCUXpresso项目,进入Project Properties > C/C++ Build > Settings > Tool Settings > MCU GCC Compiler > Includes,添加两个include目录:
C:\arm-nano-with-exceptions\arm-none-eabi\includeC:\arm-nano-with-exceptions\arm-none-eabi\include\c++\8.3.1
- 切换到MCU GCC Linker > Libraries:
- 添加库路径:
C:\arm-nano-with-exceptions\arm-none-eabi\lib\thumb\v6-m\nofp(对应Cortex-M0+的v6-M架构,无浮点) - 添加库:
stdc++_nano、supc++、m
- 添加库路径:
- 最后到MCU GCC Linker > Miscellaneous,添加链接选项:
-fexceptions和-fno-builtin
关键测试&注意事项
- 写个简单的try-catch测试代码,验证异常是否生效:
#include <iostream> int main() { try { throw 123; } catch(int e) { std::cout << "Caught exception: " << e << std::endl; // 能走到这里说明异常支持成功 } return 0; } - 一定要严格对应工具链版本,源码tag不能错,不然会出现奇怪的兼容性问题
- 如果编译过程中遇到依赖缺失,回到MSYS2用
pacman -Ss 缺失的包名搜索并安装即可
内容的提问来源于stack exchange,提问作者Victor




