编译AWS IoT嵌入式C SDK时遇CMakeLists.txt不存在错误求助
我来帮你理清楚这个问题的来龙去脉,先从你困惑的Make和CMake的调用关系说起:
为什么是Make调用CMake?
很多开源项目(包括AWS这个嵌入式C SDK)的构建系统是混合搭配的:顶层用Makefile做统一入口,负责统筹各个子模块的构建流程;而像CppUTest这类依赖库或者SDK的核心组件,用CMake来管理跨平台的编译配置。这样做的好处是,既给用户提供了简单统一的调用方式(直接跑make就行),又能借助CMake的跨平台能力适配不同系统的编译工具。所以你看到Make调用CMake完全是正常设计,不是搞反了哦~
错误的根源:缺少CppUTest子模块
你遇到的CMake Error: The source directory ".../external_libs/CppUTest" does not appear to contain CMakeLists.txt,核心原因是这个依赖的子模块没有被完整拉取。AWS IoT嵌入式C SDK把CppUTest作为单元测试框架的依赖,它是通过Git子模块的方式关联的。如果你克隆仓库的时候没加--recurse-submodules参数,或者之后没更新子模块,external_libs/CppUTest目录要么是空的,要么只有部分文件,自然找不到CMakeLists.txt。
一步步解决问题
补全Git子模块
打开终端,切换到SDK的根目录,执行以下命令拉取所有依赖的子模块源码:git submodule update --init --recursive这个命令会自动下载CppUTest的完整源码,包括它的CMakeLists.txt文件。
重新执行编译
子模块拉取完成后,再重新运行你的编译命令:make -f Makefile这时候Make会正常调用CMake处理CppUTest的构建,不会再报找不到配置文件的错误了。
给Rust链接的额外小提示
因为你最终要把静态库链接到Rust程序,编译的时候最好确保SDK的编译架构和Rust的编译环境一致。比如在Apple Silicon的Mac上,你可以通过设置环境变量指定架构:
CFLAGS="-arch arm64" make -f Makefile
如果是Intel芯片的Mac,把arm64换成x86_64就行,这样生成的静态库才能和Rust程序顺利链接。
内容的提问来源于stack exchange,提问作者sak

