在通过Yocto构建时,CMake没有传递 -Wl,-rpath-link
在下列示例 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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。