HarmonyOS 鸿蒙Next DevEco Studio中编译so,so中用到了第三方提供的静态库.a文件,编译时出错:undefined symbol: std::ios_base::Init::Init()

发布于 1周前 作者 h691938207 来自 鸿蒙OS

HarmonyOS 鸿蒙Next DevEco Studio中编译so,so中用到了第三方提供的静态库.a文件,编译时出错:undefined symbol: std::ios_base::Init::Init() DevEco Studio中编译so,so中用到了第三方提供的静态库test.a文件,编译时出错:undefined symbol: std::ios_base::Init::Init()

cmakelists.txt文件部分内容如下:

# 静态库 Libss
add_library(aes STATIC IMPORTED)
set_target_properties(aes PROPERTIES IMPORTED_LOCATION ${ROOT_PATH}/secStore/lib/${OHOS_ARCH}/libaes.a)
......

target_link_libraries(testso PRIVATE
    libace_napi.z.so
    libhilog_ndk.z.so
    libbundle_ndk.z.so
    librawfile.z.so
    libz.so
    aes
)

具体错误信息如下:

ld.lld: error: undefined symbol: std::ios_base::Init::Init()
>>> referenced by /workspaces/****/AESAPI.cpp
>>>             AESAPI.o:(__cxx_global_var_init) in archive I:/workspace/DevEcoStudioProjects/MyApplication/hello/src/main/cpp/test/lib/armeabi-v7a/libaes.a

由于libss.a是在Android平台下编译的,是不是跟这个有关?


更多关于HarmonyOS 鸿蒙Next DevEco Studio中编译so,so中用到了第三方提供的静态库.a文件,编译时出错:undefined symbol: std::ios_base::Init::Init()的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html

3 回复

是的。静态库也必须重新编译

更多关于HarmonyOS 鸿蒙Next DevEco Studio中编译so,so中用到了第三方提供的静态库.a文件,编译时出错:undefined symbol: std::ios_base::Init::Init()的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next的DevEco Studio中编译so文件时,如果遇到undefined symbol: std::ios_base::Init::Init()错误,通常是由于C++标准库的链接问题导致的。具体原因可能是:

  1. C++标准库未正确链接:在编译so文件时,未正确链接C++标准库(如libstdc++.solibc++.so)。确保在编译命令中正确指定了C++标准库的链接路径。

  2. 静态库与动态库的兼容性问题:第三方提供的静态库.a文件可能是在不同的C++标准库版本下编译的,导致与当前编译环境不兼容。确保静态库与当前编译环境使用相同的C++标准库版本。

  3. 编译器选项问题:检查编译器的选项,确保使用了正确的C++标准(如-std=c++11-std=c++14等),并且没有遗漏必要的编译选项。

  4. 符号可见性问题:确保在编译so文件时,所有必要的符号都已正确导出,并且没有遗漏任何依赖库。

解决方法:

  • CMakeLists.txtbuild.gradle中,确保正确添加了C++标准库的链接选项,例如:

    ```cmake
    target_link_libraries(your_target_name stdc++fs)
    ```
  • 确保第三方静态库与当前编译环境使用相同的C++标准库版本。

  • 检查编译器的选项,确保使用了正确的C++标准。

通过以上步骤,可以解决undefined symbol: std::ios_base::Init::Init()的编译错误。

此错误通常是由于C++标准库链接问题引起的。在编译.so文件时,确保正确链接了C++标准库。可以在CMakeLists.txt中添加以下内容:

target_link_libraries(your_target_name stdc++fs)

如果问题仍然存在,检查静态库.a文件是否与当前编译环境兼容,并确保所有依赖库都已正确链接。

回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!