Movesense按官方文档操作无法生成Ninja构建文件的报错问题
根因定位
- 首次执行cmake命令时重复传入了两次
../源码路径参数,CMake会自动忽略多余的非法路径参数,同时触发相对路径拼接错误生成带双斜杠的无效路径,直接导致找不到MovesenseFromStaticLib.cmake、提示顶层CMakeLists.txt缺失project()命令的报错。你后续手动往build目录添加MovesenseFromStaticLib.cmake的操作是完全错误的:该文件本就存在于完整拉取的movesense-device-lib库的MovesenseCoreLib目录下,手动复制单文件会破坏原有相对路径依赖关系,自然无法找到同路径下的toolchain-setup.cmake、prolog.cmake等依赖文件,也识别不到库内定义的INIT_SIMULATOR_ENVIRONMENTCMake命令。 - MinGW是Windows平台的本地x86/x64 GCC编译工具链,和Movesense传感器固件需要的nRF52架构
arm-none-eabi-gcc交叉编译工具链完全无关,安装MinGW对固件编译没有任何作用。你之前未安装对应交叉编译器,系统PATH下找不到对应可执行程序,自然会报编译器识别失败的错误。 - 你当前使用的顶层CMakeLists.txt内容完全符合官方要求,不需要做任何修改,所有报错均来自命令参数错误、依赖安装错误、错误的手动文件操作,和CMakeLists.txt本身无关。
- 你之前在Visual Studio 2017中跑通的是PC端模拟器版本,该版本使用MSVC编译器编译x86架构程序在本地运行,和烧录到传感器硬件的ARM架构固件是两套独立构建流程,二者的依赖、工具链、配置参数完全不通用,不能直接套用模拟器的构建逻辑。
解决步骤
- 清理错误操作残留:删除你手动复制到build目录下的所有自行添加的.cmake文件,清空build目录下所有CMake缓存、临时构建文件,避免旧缓存干扰后续配置流程。
- 安装正确编译依赖:安装7-2017-q4-major版本的GNU Arm Embedded Toolchain,注意Movesense固件对交叉编译器版本有强校验,版本过高或过低都会触发编译错误。安装时勾选将工具链添加到系统PATH的选项,安装完成后新开命令行窗口执行
arm-none-eabi-gcc --version,能正常输出版本号即代表环境变量配置生效。MinGW可保留也可卸载,对当前固件编译任务无影响。同时确认本地的movesense-device-lib文件完整,MovesenseCoreLib目录下无文件缺失,不要手动修改库目录内的任何文件。 - 修正CMake执行逻辑:在项目根目录(即存放顶层CMakeLists.txt的目录)下新建空的build文件夹,通过命令行进入该build目录后再执行配置命令,不要在其他路径下执行配置操作。正确的配置命令如下,不要重复传入源码路径:
cmake -G "Ninja" -DCMAKE_TOOLCHAIN_FILE=../movesense-device-lib/MovesenseCoreLib/toolchain/gcc-nrf52.cmake -DMOVESENSE_CORE_LIBRARY=../movesense-device-lib/MovesenseCoreLib -DCMAKE_BUILD_TYPE=Debug ..
注意:-D参数和后续的键值对之间不需要加多余空格,参数间用单个空格分隔,源码路径仅需在命令末尾写一次..指代上一级的项目根目录即可。
- 编译验证:CMake配置无报错后,build目录下会生成完整的Ninja构建规则,直接在build目录下执行
ninja命令即可完成示例项目的固件编译,生成可烧录到传感器的固件包。
内容的提问来源于stack exchange,提问作者Mu2tini
相关产品推荐
相关产品推荐

