讨论广场 问答详情
如果预构建so没有SONAME,链接器将会将so的绝对路径插入到依赖这个so的二进制文件的dynamic section中。怎么理解这个概念呢?
aurora6688 2026-08-23 00:54:19
44 评论 分享
harmonyos

当这些二进制文件随hap包发布运行时,动态加载器(dynamic loader)可能最终无法找到这个so而导致错误。对于初学者来说,学习鸿蒙开发如何来入门比较好?

44 评论 分享
写回答
全部评论(1)

预构建库的SONAME问题

请确保引入的预构建动态库(so)正确设置了SONAME。

如果预构建so没有SONAME,链接器将会将so的绝对路径插入到依赖这个so的二进制文件的dynamic section中。当这些二进制文件随hap包发布运行时,动态加载器(dynamic loader)可能最终无法找到这个so而导致错误。

可以使用llvm-readelf工具查看so文件是否设置了SONAME。llvm-readelf工具路径为:${DevEco Studio安装目录}/sdk/default/openharmony/native/llvm/bin或者${command-line-tools安装目录}/sdk/default/openharmony/native/llvm/bin/llvm-readelf。

示例如下:

> ${YOUR_PATH}/command-line-tools/sdk/default/openharmony/native/llvm/bin/llvm-readelf -d libavcodec_ffmpeg.so | grep SONAME
0x000000000000000e (SONAME)             Library soname: [libavcodec_ffmpeg.so]

若预构建so使用cmake进行构建,则所有的so默认会设置SONAME(只要目标平台支持)。

若预构建so使用其他构建工具,可以通过配置ldflags来设置。

${...}/clang++ ${...} -Wl,-soname,libavcodec_ffmpeg.so

使用远程依赖HAR中集成的预构建库

当使用远程依赖HAR中集成的预构建库时,CMakeLists.txt文件中引用脚本如下所示:

set(DEPENDENCY_PATH ${CMAKE_CURRENT_SOURCE_DIR}/../../../oh_modules)
add_library(library SHARED IMPORTED)
set_target_properties(library
    PROPERTIES
    IMPORTED_LOCATION ${DEPENDENCY_PATH}/library/libs/${OHOS_ARCH}/liblibrary.so)
add_library(entry SHARED hello.cpp)
target_link_libraries(entry PUBLIC libace_napi.z.so library)

使用本地HAR中集成的预构建库

当使用本地HAR中集成的预构建库时,CMakeLists.txt文件中引用脚本如下所示:

set(LIBRARY_DIR "${NATIVERENDER_ROOT_PATH}/../../../../library/build/default/intermediates/libs/default/${OHOS_ARCH}/")
add_library(library SHARED IMPORTED)
set_target_properties(library
    PROPERTIES
    IMPORTED_LOCATION ${LIBRARY_DIR}/liblibrary.so)
add_library(entry SHARED hello.cpp)
target_link_libraries(entry PUBLIC libace_napi.z.so library)

 

2026-08-23 00:55:32