You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Yocto编译报错:目标依赖libssl.so缺失且无构建规则

问题分析

错误核心是静态库依赖传递失效导致链接阶段找不到OpenSSL库:

  1. Poco以静态库方式编译(BUILD_SHARED_LIBS=OFF),静态库不会自动传递PRIVATE级别的依赖。
  2. libmariadb使用LINK_PRIVATE链接OpenSSL,该依赖仅作用于libmariadb自身编译,不会传递给依赖它的Poco::DataMySQL,更不会传递到最终的application可执行文件。
  3. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 01:50:29