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

编译Yocto配方时出现bad RPATH错误,求解决方案

问题:Yocto构建时RPATH检测报错,本地编译正常

问题背景

项目简化Makefile中用-Wl,-rpath=dir解决编译阶段链接问题,本地编译无异常,但Yocto构建时触发「contains bad RPATH」错误,查阅Yocto官方RPATH文档后仍未解决。

相关代码与日志

简化版Makefile脚本

#!/bin/bash

build() {
    cd a || exit
    g++ -c -Wall -fPIC lib.cpp
    g++ -fPIC -shared -o liba.so lib.o

    cd ../b || exit
    g++ -c -Wall -fPIC lib.cpp
    g++ -fPIC -shared -o libb.so lib.o -L ../a -Wl,-rpath="$(pwd)/../a" -la

    cd ../d || exit
    g++ -c -Wall -fPIC lib.cpp
    g++ -fPIC -shared -o libd.so lib.o -L ../b -Wl,-rpath="$(pwd)/../b" -lb

    cd ../e || exit
    g++ -c -Wall -fPIC lib.cpp
    g++ -fPIC -shared -o libe.so lib.o -L ../d -Wl,-rpath="$(pwd)/../d" -ld

    cd ../c || exit
    g++ -c -Wall -fPIE main.cpp
    g++ -fPIE -o op main.o -L../e -le

    cd ../
}

clean() {
    sudo rm a/lib.o a/liba.so
    sudo rm b/lib.o b/libb.so
    sudo rm d/lib.o d/libd.so
    sudo rm c/main.o c/op
}

Yocto配置

SUMMARY = "ABC"
DESCRIPTION = "ABC"

inherit git-utils
inherit autotools
inherit ${@'make-qnx' if d.getVar('BUILD_PLATFORM') == 'QNX' else 'make-install'}

S = "${WORKDIR}/git/abc"
B = "${S}"

XYZ_SRC_URI = "gitsm://gitlab.xyz.com/repos/abc;branch=master;protocol=https"
SRCREV_FORMAT = "abc"
SRCREV = "${AUTOREV}"

do_configure[noexec] = "1"

FILES:${PN} += " \
    ${libdir}/lib* \
"

错误日志

2026-01-14T12:49:46.180123405Z ERROR: abc-br1-r0 do_package_qa: QA Issue: package abc-br1 contains bad RPATH /home/repos/abc/../a in file /home/repos/abc/abc-br1/usr/lib/libb.so [rpaths]
2026-01-14T12:49:46.209062964Z ERROR: abc-br1-r0 do_package_qa: Fatal QA errors were found, failing task.

解决方案

原因分析

Yocto的QA检查严格禁止RPATH包含构建主机的绝对路径(如/home/repos/abc/../a),这类路径仅属于构建环境,在目标系统中不存在,因此被判定为「bad RPATH」。本地编译无此类检查,所以能正常通过。

修复步骤

  1. 改用$ORIGIN设置相对RPATH
    放弃用$(pwd)生成主机绝对路径,改用$ORIGIN(表示当前库所在目录)设置相对路径,确保在目标系统中能正确找到依赖库。注意用单引号包裹$ORIGIN,避免被Shell解析为变量:

    # b目录下libb.so的链接命令修改
    g++ -fPIC -shared -o libb.so lib.o -L ../a -Wl,-rpath='$ORIGIN/../a' -la
    # d目录下libd.so的链接命令修改
    g++ -fPIC -shared -o libd.so lib.o -L ../b -Wl,-rpath='$ORIGIN/../b' -lb
    # e目录下libe.so的链接命令修改
    g++ -fPIC -shared -o libe.so lib.o -L ../d -Wl,-rpath='$ORIGIN/../d' -ld
    
  2. 依赖Yocto自动RPATH处理机制
    Yocto的autotools或make-install类会自动处理RPATH,无需手动指定。直接删除Makefile中的-Wl,-rpath参数,Yocto会在构建时自动添加临时库路径,安装后将RPATH调整为目标系统的标准路径(如/usr/lib):

    # b目录下libb.so的链接命令简化
    g++ -fPIC -shared -o libb.so lib.o -L ../a -la
    
  3. 特殊情况:禁用RPATH QA检查(不推荐)
    若必须保留自定义RPATH,可在Yocto配置中添加以下内容跳过检查:

    INSANE_SKIP:${PN} += "rpaths"
    

额外优化

确保Makefile的安装步骤将库部署到Yocto指定的${D}${libdir}目录,让Yocto能正确识别库位置并完成RPATH的自动调整。


内容的提问来源于stack exchange,提问作者Harry

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.11 17:43:11