Skip to content

CMake交叉编译踩坑

· 2 min · STM32 / 嵌入式开发 / make / makefile / ARM / CMake / 问题解决

背景#

使用CMake搭建stm32的交叉编译工具链,编译时总是找不到汇编指令wfi。wfi指令是在cmsis中的,是arm芯片的电源管理指令,被内联汇编封装成了C语言函数,并且在cmsis的这个文件的定义中,明确规定了ACC和GNUC语法上的不同,针对不同的编译链启用不同的代码部分。

换句话说,明明是正常的交叉编译工具链,并且指定的硬件平台化的命令也是正确的,编译到这里就是会出现问题。

解决思路#

  1. CMakeLists导致的编译指令错误

    反复检查了很多遍CMakeLists,给出的编译指令是没有问题的,使用-mcpu=cortex-m4 -mthumb。

  2. 尝试在其他电脑上进行复现

    在另一台电脑上重新编译cmake,最终没有报错。

  3. 查看CMake给出的编译指令

    这里其实是一个快速高效的思路,但是因为无法判断给出的编译指令是否正确,导致没有快速找到这样的错误。实际上,是对两台电脑的编译指令进行了对比,结果发现另一台能够正常运行的电脑是能够显示交叉编译工具链的具体指令的。到这里最终就找到了问题,cmake生成的makefile自始至终都没有按照交叉编译的要求进行工作。

原因#

先前写好CMakeLists之后就直接跑了build,生成了makefile,但是再后来写了toolchain.cmake再次构建,应该是没有完全更新build,最终CMake没有使用交叉编译工具链进行编译。

问题解决#

删去build文件夹,从头进行构建和编译。