Yocto Scarthgap构建SDK时mbedtls静态库CMake路径错误排查
问题核心
添加TOOLCHAIN_TARGET_TASK += " mbedtls-staticdev mbedtls-dev"后,CMake配置文件里的库路径被硬编码为/usr/lib/libeverest.a,而非SDK sysroot下的相对路径${_IMPORT_PREFIX}/lib/libeverest.a,导致交叉编译时CMake在主机(WSL)系统路径查找库文件,引发缺失错误。同时需要仅将静态库纳入SDK,不安装到目标板。
原因分析
mbedtls recipe的CMake安装配置在生成MbedTLSTargets.cmake时,未正确处理Yocto SDK的路径重定向逻辑。当仅打包dev/staticdev包到SDK时,目标板的安装路径被直接写入配置文件,而非替换为SDK的sysroot相对路径。
解决方案步骤
修正mbedtls recipe的CMake安装配置
在mbedtls_3.6.3.bb中添加或修改以下配置,强制CMake使用变量生成相对路径的配置,避免硬编码绝对路径:EXTRA_OECMAKE += "\ -DCMAKE_INSTALL_PREFIX=${prefix} \ -DCMAKE_INSTALL_LIBDIR=${libdir} \ -DCMAKE_INSTALL_INCLUDEDIR=${includedir} \ -DUSE_STATIC_LIBS=ON \ -DUSE_SHARED_LIBS=OFF \ -DINSTALL_CMAKE_CONFIG_MODULES=ON \ -DCMAKE_INSTALL_PREFIX:PATH=${prefix} \ "确保SDK仅打包静态库相关包
保持TOOLCHAIN_TARGET_TASK += " mbedtls-staticdev mbedtls-dev",同时在local.conf中添加以下配置,排除目标板安装的mbedtls相关包:IMAGE_INSTALL_remove += "mbedtls mbedtls-dev mbedtls-staticdev"修补CMake配置文件的路径问题
如果上述步骤未解决问题,在recipe中添加do_install_append任务,将配置文件中的硬编码绝对路径替换为CMake的_IMPORT_PREFIX变量(该变量在SDK中会自动指向sysroot路径):do_install_append() { sed -i 's|/usr/lib/libeverest.a|${_IMPORT_PREFIX}/lib/libeverest.a|g' ${D}${libdir}/cmake/MbedTLS/MbedTLSTargets.cmake sed -i 's|/usr/lib/libmbedtls.a|${_IMPORT_PREFIX}/lib/libmbedtls.a|g' ${D}${libdir}/cmake/MbedTLS/MbedTLSTargets.cmake sed -i 's|/usr/lib/libmbedcrypto.a|${_IMPORT_PREFIX}/lib/libmbedcrypto.a|g' ${D}${libdir}/cmake/MbedTLS/MbedTLSTargets.cmake sed -i 's|/usr/lib/libmbedx509.a|${_IMPORT_PREFIX}/lib/libmbedx509.a|g' ${D}${libdir}/cmake/MbedTLS/MbedTLSTargets.cmake }重新构建SDK
清理缓存后重新生成SDK:bitbake mbedtls -c cleanall bitbake <your-image> -c cleanall bitbake <your-image> -c populate_sdk
场景支持说明
Yocto SDK完全支持仅将库的开发文件(静态库、头文件、CMake配置)纳入SDK而不安装到目标板的场景,核心是正确配置TOOLCHAIN_TARGET_TASK并确保recipe生成的配置文件路径适配SDK的sysroot环境。
内容的提问来源于stack exchange,提问作者Logan Gallois

