在通过Yocto构建时,CMake没有传递 -Wl,-rpath-link

编程语言 2026-07-12

在下列示例 CMakeLists.txt 中,我让 cmake 在创建目标时添加一个 -Wl,-rpath-link。这个 -Wl,-rpath-link 会在我本地的Linux PC上被传入,但在 yocto-qnx(bitbake配方)流水线中,构建失败。查看用于创建目标的构建命令后,我在该命令中没有看到 -Wl,-rpath-link

CMakeLists.txt

cmake_minimum_required(VERSION 3.16)
project(app)

include(GNUInstallDirs)

set(CMAKE_EXPORT_COMPILE_COMMANDS ON)

add_executable(${PROJECT_NAME}
    src/main.cpp
    src/abc.cpp
)

target_compile_features(${PROJECT_NAME} PRIVATE cxx_std_17)

# Enable RPATH for installed targets
set(CMAKE_SKIP_INSTALL_RPATH FALSE)  # Don't skip RPATH for installed targets
set(CMAKE_SKIP_BUILD_RPATH FALSE)  # Don't skip RPATH for built targets
set(CMAKE_INSTALL_RPATH_USE_LINK_PATH FALSE)  # Avoid conflicts with ${ORIGIN}

# Set RPATH for the installed executable
set_target_properties(${PROJECT_NAME} PROPERTIES
    INSTALL_RPATH "\${ORIGIN}/../lib"  # Escape $ with \ to preserve it
)

# In yocto QNX_SYSROOT_LIB_PATH is set to ${RECIPE_SYSROOT}${libdir}/proj
if(${QNX})
    target_link_directories(${PROJECT_NAME} PRIVATE "${QNX_SYSROOT_LIB_PATH}")
    set_target_properties(${PROJECT_NAME} PROPERTIES
        BUILD_RPATH "${QNX_SYSROOT_LIB_PATH}"
    )
else()
    target_link_directories(${PROJECT_NAME} PRIVATE "${PROJECT_SOURCE_DIR}/../../app_client")
endif()

# app_client inturn depends on cjson library
target_link_libraries(${PROJECT_NAME} PRIVATE
    app_client
)

install(TARGETS ${PROJECT_NAME} DESTINATION ${CMAKE_INSTALL_BINDIR})

yocto-recipe

SUMMARY = ""
DESCRIPTION = ""

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

S = "${WORKDIR}/git/proj/app"

APTIV_SRC_URI = "git://github.com/proj;branch=main;protocol=https"
SRCREV_FORMAT = "app"
SRCREV = "${AUTOREV}"

DEPENDS:append = " client-libs"
RDEPENDS:${PN} = " client-libs"

EXTRA_OECMAKE:append = " \
    -DCMAKE_INSTALL_INCLUDEDIR='${RECIPE_SYSROOT}${includedir}' \
    -DCMAKE_INSTALL_LIBDIR='${RECIPE_SYSROOT}${libdir}' \
    -DQNX_SYSROOT_LIB_PATH='${RECIPE_SYSROOT}${libdir}/proj' \
"

do_compile:prepend:qnx() {
    PATH=$PATH:${QNX_HOST}${bindir}
    install -d ${RECIPE_SYSROOT}${libdir}/proj/
    cp ${RECIPE_SYSROOT}${libdir}/libcjson* ${RECIPE_SYSROOT}${libdir}/proj/
    cp ${RECIPE_SYSROOT}${libdir}/libapp_client* ${RECIPE_SYSROOT}${libdir}/proj/
}


FILES:${PN} += " \
    ${bindir}/app \
"

错误

2026-02-27T09:27:21 | /opt/qnx800/host/linux/x86_64/usr/bin/aarch64-unknown-nto-qnx8.0.0-ld: warning: libcjson.so.1, needed by /home/sid_sva_mi/poky/build/tmp/work/cortexa57-poky-linux/app/dev_branch/recipe-sysroot/usr/lib/proj///libapp_client.so.1.0, not found (try using -rpath or -rpath-link)

失败后打印的构建命令

&& /opt/qnx800/host/linux/x86_64/usr/bin/q++ -Wc,-isysroot,/opt/qnx800/target/qnx -lang-c++ -Vgcc_ntoaarch64le_cxx  -D_QNX_SOURCE   -Vgcc_ntoaarch64le_cxx  -D_QNX_SOURCE  -O2  CMakeFiles/app.dir/src/main.cpp.o CMakeFiles/app.dir/src/abc.cpp.o -o app -L/home/sid_sva_mi/poky/build/tmp/work/cortexa57-poky-linux/app/dev_branch/recipe-sysroot/usr/lib/proj -lapp_client && :

解决方案

我通过在 CMakeLists.txt 中添加以下内容解决了这个问题

target_link_options(${PROJECT_NAME} PRIVATE
    # ensures CMake emits -Wl, for compiler drivers like q++
    LINKER:-rpath-link,${QNX_SYSROOT_LIB_PATH}
)
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章