Yocto Kirkstone下CMake配方编译STM32MP157应用故障求助
Yocto Kirkstone编译STM32MP157应用异常的排查思路
一、对比SDK与Yocto配方的编译配置差异
- 检查Yocto生成的CMake缓存:查看
${WORKDIR}/build/CMakeCache.txt,对比SDK交叉编译时手动指定的CMAKE_C_FLAGS、CMAKE_LINK_FLAGS等参数,重点确认优化级别(如-O2/-Os)、strip开关、编译宏定义的差异。 - 提取Yocto编译参数:执行
bitbake myapp -e,导出CFLAGS、LDFLAGS变量,和SDK交叉编译时使用的参数逐一比对,关注-static/-dynamic链接方式、库路径是否匹配。
二、验证依赖库的链接与运行时依赖
- 检查二进制链接类型:在主机或目标板上用
file myapp查看Yocto编译版本的链接类型(动态/静态),与SDK编译版本对比。 - 排查动态链接依赖:在目标板上执行
ldd myapp,确认所有依赖库已存在且版本兼容,同时检查配方的RDEPENDS是否遗漏必要的运行时包(比如部分库的运行时包名可能与开发包名不同,需确认Yocto仓库中的包名)。
三、检查CMake在Yocto环境中的执行情况
- 查看CMake日志:分析
${WORKDIR}/build/CMakeFiles/CMakeOutput.log和CMakeError.log,确认所有依赖库、头文件被正确找到,无缺失或路径错误的警告。 - 开启详细编译日志:在CMakeLists.txt中添加
set(CMAKE_VERBOSE_MAKEFILE ON),重新编译后对比Yocto生成的编译/链接命令与SDK使用的命令,看库路径、链接参数是否一致。
四、二进制文件的细节分析
- 对比二进制段大小:用
size myapp分别查看两个版本的text、data、bss段大小,定位差异来源(比如text段过小可能是strip或过度优化,data段差异可能是静态链接了额外库)。 - 检查符号表:用
objdump -x myapp分析两个版本的符号表,确认是否存在缺失符号、库符号版本不匹配的情况。
五、Yocto构建环境的特殊配置检查
- 确认架构正确性:在主机上用
file命令检查Yocto编译的二进制,确保是针对ARM架构(而非native/x86),避免BBCLASSEXTEND配置导致的编译目标错误。 - 检查strip与调试配置:查看Yocto是否默认开启了
strip(移除调试符号),若应用依赖调试符号(极少情况),可在配方中添加INHIBIT_PACKAGE_STRIP = "1"临时关闭。
六、运行时错误的精准定位
- 追踪系统调用:在目标板上执行
strace myapp,查看系统调用的失败环节(如文件打开失败、库加载失败、内存分配错误)。 - GDB调试:用gdb加载Yocto编译的二进制,获取崩溃时的栈回溯,定位到具体出错的函数调用或依赖库。
内容的提问来源于stack exchange,提问作者juanra
相关产品推荐
相关产品推荐

