HarmonyOS 鸿蒙Next DevEco Studio中编译so,so中用到了第三方提供的静态库.a文件,编译时出错:undefined symbol: std::ios_base::Init::Init()
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
是的。静态库也必须重新编译
更多关于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++标准库的链接问题导致的。具体原因可能是:
-
C++标准库未正确链接:在编译so文件时,未正确链接C++标准库(如
libstdc++.so
或libc++.so
)。确保在编译命令中正确指定了C++标准库的链接路径。 -
静态库与动态库的兼容性问题:第三方提供的静态库
.a
文件可能是在不同的C++标准库版本下编译的,导致与当前编译环境不兼容。确保静态库与当前编译环境使用相同的C++标准库版本。 -
编译器选项问题:检查编译器的选项,确保使用了正确的C++标准(如
-std=c++11
、-std=c++14
等),并且没有遗漏必要的编译选项。 -
符号可见性问题:确保在编译so文件时,所有必要的符号都已正确导出,并且没有遗漏任何依赖库。
解决方法:
-
在
CMakeLists.txt
或build.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文件是否与当前编译环境兼容,并确保所有依赖库都已正确链接。