android - libgnuSTL_shared.so 从哪里来?为什么我构建后它的大小不同?

标签 android c++ stl android-ndk qt-creator

我正在使用 armeabi-v7a 的 NDK (r11b) 为 Android 构建库,我发现了不同版本的 libgnuSTL_shared.so 并且不明白为什么。

  • 在 ndk 文件夹中(在 android-ndk-r11b\sources\cxx-STL\gnu-libstdc++\4.9\libs\armeabi-v7a\libgnuSTL_shared.so 中)它的大小是 5593ko.

  • 在我使用 ndk-build.cmd 构建我的项目(一堆库)后,库(在 libs\armeabi-v7a\libgnuSTL_shared.so 中)文件大小为 694ko

  • 在我使用 QtCreator 构建我的项目(一堆库)之后,库(在 android-build\libs\armeabi-v7a\libgnuSTL_shared.so 中)文件大小为 846ko。请注意,打包在 apk 中的库(在 android-build\bin 中)具有相同的大小。另请注意,QtCreator 构建日志报告它从 (android-ndk-r11b/sources/cxx-STL/gnu-libstdc++/4.9/libs/armeabi-v7a/libgnuSTL_shared.so)

主要问题:为什么编译后的文件比原来的小?链接器/编译器是否会在某个时候缩小文件(删除未使用的符号)?

奖励问题:我终于用 QtCreator 构建了我的项目(以 846ko 的 libgnuSTL_shared.so 结束)并将我的 so 文件(但 libgnuSTL_shared.so)提供给其他人将把它集成到他自己的应用程序中。在他部署应用程序后,他的 IDE(我相信是 Android 工作室)使用 694ko 的 libgnuSTL_shared.so 部署它,我的代码开始在 STL 操作中崩溃。这些崩溃可能是由于与使用的 libgnuSTL_shared.so 不匹配造成的吗?我们应该如何解决这个问题? (由于QtCreator不允许我使用静态版本的libgnuSTL_shared.so来构建,所以我们最终应该使用哪个版本进行部署?)

请注意,我的项目是使用 QtCreator 编译的,但没有使用 Qt(我使用 Qt 从 GUI 测试我的库,但库本身根本不使用 Qt)

最佳答案

Why is the file after compilation smaller than the original one? Does the linker/compiler shrink the file at some point (removing unused symbols)?

是的,共享库在安装到库输出目录后被剥离。 NDK 中的库没有预先剥离,因为这样做会阻止用户调试它们。

另请注意,对于 r11 和更早版本,有两个 armeabi-v7a 库。您指定的那个,另一个在“thumb”子目录中。实际只使用了拇指之一(这就是为什么在 r12 中删除了非拇指的原因)。

Could those crashs be due to a mismatch with libgnustl_shared.so used?

如果它们是不同版本的 libgnuSTL_shared.so(不是来自相同的 NDK 版本),是的,绝对是。如果它们都来自 r11 并且都是 armeabi-v7a(thumb 或非 thumb),那么它们应该是兼容的。如果其中任何一个正在使用库的 armeabi-v7a-hard 版本(在 r12 中删除),那么这肯定也是一个问题。 armeabi-v7a 与 armeabi 的混合不太确定,但可能是个问题。

关于android - libgnuSTL_shared.so 从哪里来?为什么我构建后它的大小不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40147359/

相关文章:

android - 在 Eclipse 中调试 Android Widget 代码

android - 更改android中进度条背景的颜色

c++ - 如何修复( 'vector' : undeclared identifier ) in my header file?

c++ - 为什么 std::map::operator[] 如此违反直觉?

android - 任何人都可以完全指导 eclipse 和 mysql 配置和连接

java - Android Admob 请求持续增加

c++ - C++ Metro 风格应用程序中的资源

c++ - 无法在 VIsual Express 2012 中包含 libcurl

c++ - 以相反的顺序插入 vector

c++ - 列表迭代器不可取消引用