HarmonyOS鸿蒙Next中三方库可以用ndk构建成功,推送真机运行报错 __emutls_get_address: symbol not found
HarmonyOS鸿蒙Next中三方库可以用ndk构建成功,推送真机运行报错 __emutls_get_address: symbol not found
环境
windows 10
DevEco Studio 5.0.2 自带的ndk工具
Mate 60
构建
用的sole这个三方库生成uuid
https://github.com/r-lyeh-archived/sole
下载后放到项目目录,目录结构如下
build
sole
sole.hpp
main.cpp
CMakeLists.txt
CMAKE_MINIMUM_REQUIRED(VERSION 3.15)
PROJECT(HELLO)
include_directories(
sole
)
set(CMAKE_CXX_STANDARD 11)
add_definitions(-std=c++11 -lrt)
ADD_EXECUTABLE(hello main.cpp)
main.cpp
#include <string>
#include <sole.hpp>
int main() {
std::string uuid = sole::uuid4().str();
printf("%s\n", uuid.c_str());
return 0;
}
构建命令,在build目录下执行
"C:\Program Files\HuaWei\DevEco Studio\sdk\default\openharmony\native\build-tools\cmake\bin\cmake.exe" -G "Ninja" -DOHOS_STL=c++_shared -DOHOS_ARCH=arm64-v8a -DOHOS_PLATFORM=OHOS -DCMAKE_MAKE_PROGRAM="C:\Program Files\HuaWei\DevEco Studio\sdk\default\openharmony\native\build-tools\cmake\bin\ninja.exe" -DCMAKE_TOOLCHAIN_FILE="C:\Program Files\HuaWei\DevEco Studio\sdk\default\openharmony\native\build\cmake\ohos.toolchain.cmake" ..
再在build目录下执行
"C:\Program Files\HuaWei\DevEco Studio\sdk\default\openharmony\native\build-tools\cmake\bin\ninja.exe" -f build.ninja
将构建好的hello用hdc工具推送至鸿蒙,并执行,仅返回如下错误
Error relocating /data/local/tmp/hello: __emutls_get_address: symbol not found
更多关于HarmonyOS鸿蒙Next中三方库可以用ndk构建成功,推送真机运行报错 __emutls_get_address: symbol not found的实战教程也可以访问 https://www.itying.com/category-93-b0.html
在HarmonyOS鸿蒙Next中,使用NDK构建三方库时,推送真机运行报错 __emutls_get_address: symbol not found
,通常是由于NDK的编译环境与鸿蒙系统的ABI(应用二进制接口)不兼容导致的。鸿蒙系统使用了自己的ABI,与Android的ABI存在差异,特别是在处理线程本地存储(TLS)时。
NDK默认生成的二进制文件可能依赖于Android的libc
或bionic
库,而鸿蒙系统使用的是自己的musl libc
库,这会导致在鸿蒙系统上运行时找不到某些符号,如__emutls_get_address
。
解决方法通常是确保在编译三方库时,使用与鸿蒙系统兼容的工具链和编译选项。鸿蒙系统提供了自己的编译工具链,开发者需要使用鸿蒙的编译工具链来重新编译三方库,而不是直接使用NDK生成的二进制文件。
具体操作包括:
- 使用鸿蒙系统提供的
ohos-clang
或ohos-gcc
等工具链进行编译。 - 确保编译时指定了鸿蒙系统的ABI和相关库路径。
- 检查并修改三方库的源码,确保其与鸿蒙系统的ABI和库兼容。
通过这些步骤,可以解决__emutls_get_address: symbol not found
的报错问题。
更多关于HarmonyOS鸿蒙Next中三方库可以用ndk构建成功,推送真机运行报错 __emutls_get_address: symbol not found的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html