1# 在NDK工程中使用预构建库 2 3在NDK工程中,可以通过CMake语法规则引入并使用预构建库。在引用预构建库时,模块libs目录中的预构建库,以及在`CMakeList.txt`编译脚本中声明的预构建库都会被打包。 4 5## 预构建库使用约束 6 71.确保引入的SO动态库是通过[OpenHarmony NDK 编译工具链](build-with-ndk-overview.md)编译生成,如何通过[OpenHarmony NDK 编译工具链](build-with-ndk-overview.md)编译预构建库,请参照[CMake构建三方库适配流程](https://developer.huawei.com/consumer/cn/doc/best-practices/bpta-cmake-adapts-to-harmonyos#section1826019653918)。 8 92.确保引入的SO动态库的依赖库也导入到工程中且通过[OpenHarmony NDK 编译工具链](build-with-ndk-overview.md)编译生成。 10 11## 直接引入预构建库 12 13可以通过直接将预构建的库文件复制到项目文件中, 来使用预构建库。例如在项目中需要使用预构建库`libavcodec_ffmpeg.so`,其开发态存放路径如下图所示: 14 15 16 17在模块的`CMakeLists.txt`编译脚本中通过`add_library`添加所需的预构建库,并声明预构建库路径等信息后,可以在`target_link_libraries`中声明链接该预构建库,脚本示例如下所示: 18 19```cmake 20add_library(library SHARED hello.cpp) 21 22add_library(avcodec_ffmpeg SHARED IMPORTED) 23set_target_properties(avcodec_ffmpeg 24 PROPERTIES 25 IMPORTED_LOCATION ${CMAKE_CURRENT_SOURCE_DIR}/third_party/FFmpeg/libs/${OHOS_ARCH}/libavcodec_ffmpeg.so) 26 27target_link_libraries(library PUBLIC libace_napi.z.so avcodec_ffmpeg) 28``` 29 30在模块的`CMakeLists.txt`编译脚本中添加`include_directories`: 31 32```cmake 33include_directories( 34 ... 35 ${CMAKE_CURRENT_SOURCE_DIR}/third_party/FFmpeg/include 36) 37``` 38 39当在HAR中使用预构建库时,当前编译的库和链接所需预构建库会打包到HAR中的libs目录下,如下图所示: 40 41 42 43### 预构建库的SONAME问题 44 45请确保引入的预构建动态库(so)正确设置了`SONAME`。 46 47如果预构建so没有`SONAME`,链接器将会将so的绝对路径插入到依赖这个so的二进制文件的`dynamic section`中。当这些二进制文件随hap包发布运行时,动态加载器(`dynamic loader`)可能最终无法找到这个so而导致错误。 48 49可以使用`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`。 50示例如下: 51 52```bash 53> ${YOUR_PATH}/command-line-tools/sdk/default/openharmony/native/llvm/bin/llvm-readelf -d libavcodec_ffmpeg.so | grep SONAME 540x000000000000000e (SONAME) Library soname: [libavcodec_ffmpeg.so] 55``` 56 57若预构建so使用cmake进行构建,则所有的so默认会设置`SONAME`(只要目标平台支持)。 58若预构建so使用其他构建工具,可以通过配置`ldflags`来设置。 59 60```bash 61${...}/clang++ ${...} -Wl,-soname,libavcodec_ffmpeg.so 62``` 63 64## 使用远程依赖HAR中集成的预构建库 65 66当使用远程依赖HAR中集成的预构建库时,`CMakeLists.txt`文件中引用脚本如下所示: 67 68```cmake 69set(DEPENDENCY_PATH ${CMAKE_CURRENT_SOURCE_DIR}/../../../oh_modules) 70add_library(library SHARED IMPORTED) 71set_target_properties(library 72 PROPERTIES 73 IMPORTED_LOCATION ${DEPENDENCY_PATH}/library/libs/${OHOS_ARCH}/liblibrary.so) 74add_library(entry SHARED hello.cpp) 75target_link_libraries(entry PUBLIC libace_napi.z.so library) 76``` 77 78## 使用本地HAR中集成的预构建库 79 80当使用本地HAR中集成的预构建库时,`CMakeLists.txt`文件中引用脚本如下所示: 81 82```cmake 83set(LIBRARY_DIR "${NATIVERENDER_ROOT_PATH}/../../../../library/build/default/intermediates/libs/default/${OHOS_ARCH}/") 84add_library(library SHARED IMPORTED) 85set_target_properties(library 86 PROPERTIES 87 IMPORTED_LOCATION ${LIBRARY_DIR}/liblibrary.so) 88add_library(entry SHARED hello.cpp) 89target_link_libraries(entry PUBLIC libace_napi.z.so library) 90``` 91