as

Settings
Sign out
Notifications
Alexa
亚马逊应用商店
Ring
AWS
文档
Support
Contact Us
My Cases
新手入门
设计和开发
应用发布
参考
支持

修复链接器命名空间问题

修复链接器命名空间问题

本页提供使用原生代码构建和运行Vega应用时常见的链接器命名空间问题的解决方案。每个问题都包括错误消息、原因和分步解决说明。

构建失败,出现消息“library found in package”(在程序包中找到库)

错误消息:

Error: System library 'libpthread.so.0' found in package.This library is on the public ABI list and should be dynamically linked, not bundled.(在程序包中找到系统库“libpthread.so.0”。该库在公开ABI列表中,应动态链接,而不是捆绑在一起。

原因: 您的程序包捆绑了一个系统库,该系统库显示在Vega OS公共ABI列表中。动态链接这些库,而不是捆绑它们。

解决方案:

  1. 从您的程序包中移除捆绑的库。

  2. 更新您的构建配置以动态链接:

    # CMakeLists.txt示例
    target_link_libraries(your_app PRIVATE pthread)
    
  3. 重建您的程序包:

    已复制到剪贴板。

    vega build
    
  4. 确认该库不再捆绑在一起:

    已复制到剪贴板。

    vega package list-libs <您的程序包.vpkg>
    

运行时错误:“cannot open shared object file”(无法打开共享对象文件)

错误消息:

error while loading shared libraries: libcustom.so: cannot open shared object file: No such file or directory(加载共享库时出错:libcustom.so:无法打开共享目标文件:没有此文件或目录)

原因: 您的应用依赖于未捆绑在您的程序包中的第三方库。

解决方案:

  1. 确认该库不在Vega OS公共ABI列表中

  2. 将库捆绑在您的程序包中:

    # CMakeLists.txt示例
    find_library(CUSTOM_LIBRARY custom)
    install(FILES ${CUSTOM_LIBRARY} DESTINATION lib)
    
  3. 重建并重新安装您的程序包:

    已复制到剪贴板。

    vega build
    vega device install-app --packagePath <您的程序包.vpkg>
    

符号解析在运行时失败

错误消息:

undefined symbol: custom_function(未定义的符号:custom_function)

原因: 您的应用依赖环境符号而不是明确的依赖项。

解决方案:

  1. 确定哪个库提供了缺失的符号:

    已复制到剪贴板。

    nm -D <library.so> | grep custom_function
    
  2. 使用DT_NEEDEDdlopen() 添加显式依赖项:

    # CMakeLists.txt示例
    target_link_libraries(your_app PRIVATE custom_library)
    
  3. 重建您的程序包:

    已复制到剪贴板。

    vega build
    

从错误的命名空间加载库

症状: 即使库似乎已成功加载,您的应用在调用库函数时也会崩溃或出现意外行为。

原因: 动态链接器加载的库版本与预期版本不同,通常是因为:

  • 您在dlopen() 中使用了完全限定路径
  • 库名称与公共ABI列表中的库名称相匹配

解决方案:

  1. dlopen() 调用中使用非限定库名称:

    // 正确
    dlopen("libutil.so.1", RTLD_NOW);
       
    // 不正确:避免使用完全限定路径
    dlopen("/pkg/lib/aarch64/libutil.so.1", RTLD_NOW);
    
  2. 确认您的库不在公开ABI列表中。如果是,将始终加载系统版本。

  3. 在实际设备上测试以确认库正确加载:

    已复制到剪贴板。

    vega device shell -d <设备>
    cat /proc/<pid>/maps | grep libutil
    

ABI验证通过,但运行时失败

症状: 您的程序包通过了构建时ABI验证,但应用因链接器错误而在运行时失败。

原因: 构建时验证无法捕获所有运行时场景,特别是:

  • 运行时构造的动态dlopen路径
  • 环境符号依赖项
  • 根据运行时状态加载条件库

解决方案:

  1. 查看代码中的所有dlopen() 调用以进行动态路径构造:

    // 存在问题:运行时构造的路径
    char path[256];
    sprintf(path, "/pkg/lib/%s/libcustom.so", arch);
    dlopen(path, RTLD_NOW);
       
    // 更佳方式:使用非限定名称
    dlopen("libcustom.so", RTLD_NOW);
    
  2. 确保使用非限定的库名称。

  3. 在物理设备上进行彻底测试。

  4. 检查设备日志中是否存在链接器错误:

    已复制到剪贴板。

    vega device shell -d <设备> logcat | grep linker
    

缺少DT_NEEDED条目

症状: 您的应用成功构建,但由于缺少符号错误而在运行时失败。

原因: 您的构建配置未正确声明库依赖项,导致链接器跳过添加DT_NEEDED条目。

解决方案:

  1. 检查当前DT_NEEDED条目:

    已复制到剪贴板。

    readelf -d <您的库.so> | grep NEEDED
    
  2. 将缺失的依赖项添加到您的构建配置中:

    # CMakeLists.txt示例
    target_link_libraries(your_app PRIVATE
        pthread
        m
        custom_library
    )
    
  3. 重建并验证DT_NEEDED条目是否存在:

    已复制到剪贴板。

    vega build
    readelf -d build/<arch>/your-library.so | grep NEEDED
    

库版本冲突

症状: 您的应用可在Vega虚拟设备上运行,但在物理设备上无法运行,或反之亦然。

原因: 您的捆绑库和系统库之间或虚拟和物理设备环境之间的库版本不同。

解决方案:

  1. 验证您在程序包中捆绑了哪些库:

    已复制到剪贴板。

    vega package list-libs <您的程序包.vpkg>
    
  2. 请改为检查哪些库应该进行动态链接:

    • 将您的捆绑库与公共ABI列表进行比较
    • 移除所有匹配项并动态关联它们
  3. 在虚拟和物理设备上进行测试以确保一致性。


Last updated: 2026年6月18日