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

Android交叉编译原生可执行文件添加$ORIGIN RPATH无效问题排查

Android交叉编译时CMake RPATH配置无效的解决方法

问题背景

交叉编译Android可执行文件时,编译流程正常,但可执行文件无法加载同目录下的.so库。添加RPATH相关CMake配置后,用readelf/objdump查看二进制文件,完全找不到RPATH信息;但相同CMake配置在Linux宿主系统构建时,RPATH能正常生效。

核心原因

Android NDK的CMake工具链默认禁用了RPATH机制,同时CMake中$ORIGIN的$是特殊字符,直接编写会被CMake解析为变量引用,无法原样传递给链接器,这两个因素共同导致RPATH配置失效。

解决方案

1. 正确转义$ORIGIN并强制开启RPATH

在CMake中必须对$ORIGIN的$进行转义,避免被CMake当作变量处理,同时显式覆盖NDK工具链的RPATH禁用设置:

set(TARGET myapp)

# 强制开启RPATH相关设置
set(CMAKE_SKIP_BUILD_RPATH OFF)
set(CMAKE_SKIP_RPATH OFF)
set(CMAKE_BUILD_WITH_INSTALL_RPATH ON)

# 转义$,确保$ORIGIN原样传递给链接器
set(CMAKE_INSTALL_RPATH "\$ORIGIN")

# 显式为目标设置RPATH属性
set_target_properties(${TARGET} PROPERTIES
    BUILD_RPATH "\$ORIGIN"
    INSTALL_RPATH "\$ORIGIN"
    INSTALL_RPATH_USE_LINK_PATH FALSE
)

add_executable(${TARGET} src.cpp)
# 链接依赖的共享库
target_link_libraries(${TARGET} PRIVATE your_shared_library)

2. 验证RPATH是否生效

使用Android NDK自带的readelf工具检查二进制文件:

# 替换为你的NDK路径和目标架构工具链路径
${NDK_ROOT}/toolchains/llvm/prebuilt/[你的宿主平台]/bin/[目标架构]-linux-android-readelf -d path/to/myapp

输出中如果出现类似以下内容,说明RPATH配置成功:

0x0000000f (RPATH)              Library rpath: [$ORIGIN]

3. 额外注意事项

  • Android 7.0及以上版本的动态链接器支持$ORIGIN,但如果将可执行文件部署到系统目录(如/system/bin),可能受SELinux限制导致RPATH失效,建议部署到/data/local/tmp等用户目录测试。
  • 如果依赖的.so库本身也有RPATH需求,需要对共享库目标添加相同的RPATH配置。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 11:40:52