You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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\include
    • C:\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++_nanosupc++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

火山引擎 最新活动