Yocto编译报错:目标依赖libssl.so缺失且无构建规则
问题分析
错误核心是静态库依赖传递失效导致链接阶段找不到OpenSSL库:
- Poco以静态库方式编译(
BUILD_SHARED_LIBS=OFF),静态库不会自动传递PRIVATE级别的依赖。 - libmariadb使用
LINK_PRIVATE链接OpenSSL,该依赖仅作用于libmariadb自身编译,不会传递给依赖它的Poco::DataMySQL,更不会传递到最终的application可执行文件。 - Yocto构建环境隔离,application的配方未显式依赖openssl,导致其构建上下文的
recipe-sysroot中没有OpenSSL库文件,ninja只能尝试从mariadb的私有构建路径寻找,而该路径对application不可用。
解决方案
方案1:显式在应用CMake中添加OpenSSL依赖
修改应用的CMakeLists.txt,直接引入OpenSSL并链接到可执行目标:
# 在现有find_package语句后添加 find_package(OpenSSL REQUIRED) # 修改target_link_libraries部分 target_link_libraries(server_exe PRIVATE Poco::Util Poco::DataMySQL OpenSSL::SSL OpenSSL::Crypto )
同时修改application_1.0.0.bb,添加openssl到依赖:
DEPENDS += "openssl"
方案2:修复libmariadb的CMake依赖传递
如果有权限修改libmariadb的构建配置,将其链接OpenSSL的方式从LINK_PRIVATE改为PUBLIC:
# 替换原libmariadb的链接语句 TARGET_LINK_LIBRARIES(libmariadb PUBLIC ${SYSTEM_LIBS})
此修改会让OpenSSL依赖自动传递到所有依赖libmariadb的目标(包括Poco::DataMySQL和application),无需修改application的CMake或配方(只需确保mariadb的配方已依赖openssl)。
方案3:仅在Yocto配方中添加OpenSSL依赖(不推荐)
若暂时无法修改CMake代码,可直接在application_1.0.0.bb中添加:
DEPENDS += "openssl"
但此方案仅保证OpenSSL库出现在application的recipe-sysroot中,仍可能因CMake未显式处理链接导致符号未找到问题,需配合方案1使用更可靠。
内容的提问来源于stack exchange,提问作者mmnano50
相关产品推荐
相关产品推荐

